@@ -1112,6 +1112,34 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
1112
1112
&& !(OP2_INFO () & MAY_BE_OBJECT )) {
1113
1113
opline -> opcode = ZEND_FAST_CONCAT ;
1114
1114
}
1115
+ } else if (opline -> opcode == ZEND_VERIFY_RETURN_TYPE
1116
+ && opline -> op1_type != IS_CONST
1117
+ && ssa -> ops [op_1 ].op1_def == v
1118
+ && ssa -> ops [op_1 ].op1_use >= 0
1119
+ && ssa -> ops [op_1 ].op1_use_chain == -1
1120
+ && ssa -> vars [v ].use_chain >= 0
1121
+ && can_elide_return_type_check (op_array , ssa , & ssa -> ops [op_1 ])) {
1122
+
1123
+ // op_1: VERIFY_RETURN_TYPE #orig_var.? [T] -> #v.? [T] => NOP
1124
+
1125
+ int orig_var = ssa -> ops [op_1 ].op1_use ;
1126
+ if (zend_ssa_unlink_use_chain (ssa , op_1 , orig_var )) {
1127
+
1128
+ int ret = ssa -> vars [v ].use_chain ;
1129
+
1130
+ ssa -> ops [ret ].op1_use = orig_var ;
1131
+ ssa -> ops [ret ].op1_use_chain = ssa -> vars [orig_var ].use_chain ;
1132
+ ssa -> vars [orig_var ].use_chain = ret ;
1133
+
1134
+ ssa -> vars [v ].definition = -1 ;
1135
+ ssa -> vars [v ].use_chain = -1 ;
1136
+
1137
+ ssa -> ops [op_1 ].op1_def = -1 ;
1138
+ ssa -> ops [op_1 ].op1_use = -1 ;
1139
+
1140
+ MAKE_NOP (opline );
1141
+ remove_nops = 1 ;
1142
+ }
1115
1143
}
1116
1144
}
1117
1145
@@ -1290,34 +1318,6 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
1290
1318
opline -> extended_value = 0 ;
1291
1319
SET_UNUSED (opline -> op2 );
1292
1320
1293
- } else if (opline -> opcode == ZEND_VERIFY_RETURN_TYPE
1294
- && ssa -> ops [op_1 ].op1_def == v
1295
- && ssa -> ops [op_1 ].op1_use >= 0
1296
- && ssa -> ops [op_1 ].op1_use_chain == -1
1297
- && ssa -> vars [v ].use_chain >= 0
1298
- && can_elide_return_type_check (op_array , ssa , & ssa -> ops [op_1 ])) {
1299
-
1300
- // op_1: VERIFY_RETURN_TYPE #orig_var.CV [T] -> #v.CV [T] => NOP
1301
-
1302
- int orig_var = ssa -> ops [op_1 ].op1_use ;
1303
- if (zend_ssa_unlink_use_chain (ssa , op_1 , orig_var )) {
1304
-
1305
- int ret = ssa -> vars [v ].use_chain ;
1306
-
1307
- ssa -> ops [ret ].op1_use = orig_var ;
1308
- ssa -> ops [ret ].op1_use_chain = ssa -> vars [orig_var ].use_chain ;
1309
- ssa -> vars [orig_var ].use_chain = ret ;
1310
-
1311
- ssa -> vars [v ].definition = -1 ;
1312
- ssa -> vars [v ].use_chain = -1 ;
1313
-
1314
- ssa -> ops [op_1 ].op1_def = -1 ;
1315
- ssa -> ops [op_1 ].op1_use = -1 ;
1316
-
1317
- MAKE_NOP (opline );
1318
- remove_nops = 1 ;
1319
- }
1320
-
1321
1321
} else if (ssa -> ops [op_1 ].op1_def == v
1322
1322
&& !RETURN_VALUE_USED (opline )
1323
1323
&& ssa -> ops [op_1 ].op1_use >= 0
0 commit comments