@@ -245,8 +245,6 @@ static bool can_replace_op1(
245
245
case ZEND_SEND_USER :
246
246
case ZEND_FE_RESET_RW :
247
247
return 0 ;
248
- case ZEND_SEND_VAR :
249
- return ssa_op -> op1_def == -1 ;
250
248
/* Do not accept CONST */
251
249
case ZEND_ROPE_ADD :
252
250
case ZEND_ROPE_END :
@@ -1052,9 +1050,15 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1052
1050
case ZEND_SEND_VAL :
1053
1051
case ZEND_SEND_VAR :
1054
1052
{
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
+ //}
1058
1062
SET_RESULT_BOT (op1 );
1059
1063
}
1060
1064
@@ -1066,7 +1070,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
1066
1070
}
1067
1071
1068
1072
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
1070
1074
|| call -> caller_call_opline -> opcode != ZEND_DO_ICALL ) {
1071
1075
return ;
1072
1076
}
@@ -2344,6 +2348,9 @@ static int replace_constant_operands(sccp_ctx *ctx) {
2344
2348
FOREACH_USE (var , use ) {
2345
2349
zend_op * opline = & op_array -> opcodes [use ];
2346
2350
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
+ }
2347
2354
if (try_replace_op1 (ctx , opline , ssa_op , i , value )) {
2348
2355
if (opline -> opcode == ZEND_NOP ) {
2349
2356
removed_ops ++ ;
0 commit comments