@@ -407,40 +407,28 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa)
407407 zend_call_info * call_info = func_info -> callee_info ;
408408
409409 do {
410- if (call_info -> caller_call_opline
411- && call_info -> caller_call_opline -> opcode == ZEND_DO_ICALL
410+ zend_op * op = call_info -> caller_init_opline ;
411+
412+ if ((op -> opcode == ZEND_FRAMELESS_ICALL_2
413+ || (op -> opcode == ZEND_FRAMELESS_ICALL_3 && (op + 1 )-> op1_type == IS_CONST ))
412414 && call_info -> callee_func
413- && zend_string_equals_literal (call_info -> callee_func -> common .function_name , "in_array" )
414- && (call_info -> caller_init_opline -> extended_value == 2
415- || (call_info -> caller_init_opline -> extended_value == 3
416- && (call_info -> caller_call_opline - 1 )-> opcode == ZEND_SEND_VAL
417- && (call_info -> caller_call_opline - 1 )-> op1_type == IS_CONST ))) {
418-
419- zend_op * send_array ;
420- zend_op * send_needly ;
415+ && zend_string_equals_literal_ci (call_info -> callee_func -> common .function_name , "in_array" )) {
416+
421417 bool strict = 0 ;
418+ bool has_opdata = op -> opcode == ZEND_FRAMELESS_ICALL_3 ;
422419 ZEND_ASSERT (!call_info -> is_prototype );
423420
424- if (call_info -> caller_init_opline -> extended_value == 2 ) {
425- send_array = call_info -> caller_call_opline - 1 ;
426- send_needly = call_info -> caller_call_opline - 2 ;
427- } else {
428- if (zend_is_true (CT_CONSTANT_EX (op_array , (call_info -> caller_call_opline - 1 )-> op1 .constant ))) {
421+ if (has_opdata ) {
422+ if (zend_is_true (CT_CONSTANT_EX (op_array , (op + 1 )-> op1 .constant ))) {
429423 strict = 1 ;
430424 }
431- send_array = call_info -> caller_call_opline - 2 ;
432- send_needly = call_info -> caller_call_opline - 3 ;
433425 }
434426
435- if (send_array -> opcode == ZEND_SEND_VAL
436- && send_array -> op1_type == IS_CONST
437- && Z_TYPE_P (CT_CONSTANT_EX (op_array , send_array -> op1 .constant )) == IS_ARRAY
438- && (send_needly -> opcode == ZEND_SEND_VAL
439- || send_needly -> opcode == ZEND_SEND_VAR )
440- ) {
427+ if (op -> op2_type == IS_CONST
428+ && Z_TYPE_P (CT_CONSTANT_EX (op_array , op -> op2 .constant )) == IS_ARRAY ) {
441429 bool ok = 1 ;
442430
443- HashTable * src = Z_ARRVAL_P (CT_CONSTANT_EX (op_array , send_array -> op1 .constant ));
431+ HashTable * src = Z_ARRVAL_P (CT_CONSTANT_EX (op_array , op -> op2 .constant ));
444432 HashTable * dst ;
445433 zval * val , tmp ;
446434 zend_ulong idx ;
@@ -471,59 +459,15 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa)
471459 }
472460
473461 if (ok ) {
474- uint32_t op_num = send_needly - op_array -> opcodes ;
475- zend_ssa_op * ssa_op = ssa -> ops + op_num ;
476-
477- if (ssa_op -> op1_use >= 0 ) {
478- /* Reconstruct SSA */
479- int var_num = ssa_op -> op1_use ;
480- zend_ssa_var * var = ssa -> vars + var_num ;
481-
482- ZEND_ASSERT (ssa_op -> op1_def < 0 );
483- zend_ssa_unlink_use_chain (ssa , op_num , ssa_op -> op1_use );
484- ssa_op -> op1_use = -1 ;
485- ssa_op -> op1_use_chain = -1 ;
486- op_num = call_info -> caller_call_opline - op_array -> opcodes ;
487- ssa_op = ssa -> ops + op_num ;
488- ssa_op -> op1_use = var_num ;
489- ssa_op -> op1_use_chain = var -> use_chain ;
490- var -> use_chain = op_num ;
491- }
492-
493462 ZVAL_ARR (& tmp , dst );
494463
495464 /* Update opcode */
496- call_info -> caller_call_opline -> opcode = ZEND_IN_ARRAY ;
497- call_info -> caller_call_opline -> extended_value = strict ;
498- call_info -> caller_call_opline -> op1_type = send_needly -> op1_type ;
499- call_info -> caller_call_opline -> op1 .num = send_needly -> op1 .num ;
500- call_info -> caller_call_opline -> op2_type = IS_CONST ;
501- call_info -> caller_call_opline -> op2 .constant = zend_optimizer_add_literal (op_array , & tmp );
502- if (call_info -> caller_init_opline -> extended_value == 3 ) {
503- MAKE_NOP (call_info -> caller_call_opline - 1 );
504- }
505- MAKE_NOP (call_info -> caller_init_opline );
506- MAKE_NOP (send_needly );
507- MAKE_NOP (send_array );
508- removed_ops ++ ;
509-
510- op_num = call_info -> caller_call_opline - op_array -> opcodes ;
511- ssa_op = ssa -> ops + op_num ;
512- if (ssa_op -> result_def >= 0 ) {
513- int var = ssa_op -> result_def ;
514- int use = ssa -> vars [var ].use_chain ;
515-
516- /* If the result is used only in a JMPZ/JMPNZ, replace result type with
517- * IS_TMP_VAR, which will enable use of smart branches. Don't do this
518- * in other cases, as not all opcodes support both VAR and TMP. */
519- if (ssa -> vars [var ].phi_use_chain == NULL
520- && ssa -> ops [use ].op1_use == var
521- && ssa -> ops [use ].op1_use_chain == -1
522- && (op_array -> opcodes [use ].opcode == ZEND_JMPZ
523- || op_array -> opcodes [use ].opcode == ZEND_JMPNZ )) {
524- call_info -> caller_call_opline -> result_type = IS_TMP_VAR ;
525- op_array -> opcodes [use ].op1_type = IS_TMP_VAR ;
526- }
465+ op -> opcode = ZEND_IN_ARRAY ;
466+ op -> extended_value = strict ;
467+ op -> op2 .constant = zend_optimizer_add_literal (op_array , & tmp );
468+ if (has_opdata ) {
469+ MAKE_NOP (op + 1 );
470+ removed_ops ++ ;
527471 }
528472 }
529473 }
0 commit comments