@@ -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