@@ -245,8 +245,6 @@ static bool can_replace_op1(
245245 case ZEND_SEND_USER :
246246 case ZEND_FE_RESET_RW :
247247 return 0 ;
248- case ZEND_SEND_VAR :
249- return ssa_op -> op1_def == -1 ;
250248 /* Do not accept CONST */
251249 case ZEND_ROPE_ADD :
252250 case ZEND_ROPE_END :
@@ -1052,9 +1050,15 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
10521050 case ZEND_SEND_VAL :
10531051 case ZEND_SEND_VAR :
10541052 {
1055- if (opline -> opcode == ZEND_SEND_VAR ) {
1056- /* TODO ? */
1057- /* Can be UNDEF or a value copy */
1053+ SKIP_IF_TOP (op1 );
1054+
1055+ if (opline -> opcode == ZEND_SEND_VAR && ssa_op -> op1_def >= 0 ) {
1056+ //if (IS_BOT(op1)) {
1057+ // SET_RESULT_BOT(op1);
1058+ //} else {
1059+ // /* Can be UNDEF or a value copy */
1060+ // SET_RESULT(op1, op1);
1061+ //}
10581062 SET_RESULT_BOT (op1 );
10591063 }
10601064
@@ -1066,7 +1070,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
10661070 }
10671071
10681072 call = ctx -> call_map [opline - ctx -> scdf .op_array -> opcodes ];
1069- if (IS_TOP ( op1 ) || !call || !call -> caller_call_opline
1073+ if (!call || !call -> caller_call_opline
10701074 || call -> caller_call_opline -> opcode != ZEND_DO_ICALL ) {
10711075 return ;
10721076 }
@@ -2344,6 +2348,9 @@ static int replace_constant_operands(sccp_ctx *ctx) {
23442348 FOREACH_USE (var , use ) {
23452349 zend_op * opline = & op_array -> opcodes [use ];
23462350 zend_ssa_op * ssa_op = & ssa -> ops [use ];
2351+ if (opline -> opcode == ZEND_SEND_VAR && ssa_op -> op1_def >= 0 ) {
2352+ zend_ssa_replace_op1_def_op1_use (ssa , ssa_op );
2353+ }
23472354 if (try_replace_op1 (ctx , opline , ssa_op , i , value )) {
23482355 if (opline -> opcode == ZEND_NOP ) {
23492356 removed_ops ++ ;
0 commit comments