@@ -92,30 +92,33 @@ static void strip_leading_nops(zend_op_array *op_array, zend_basic_block *b)
92
92
{
93
93
zend_op * opcodes = op_array -> opcodes ;
94
94
95
- while ( b -> len > 0 && opcodes [ b -> start ]. opcode == ZEND_NOP ) {
95
+ do {
96
96
/* check if NOP breaks incorrect smart branch */
97
97
if (b -> len == 2
98
- && (op_array -> opcodes [b -> start + 1 ].opcode == ZEND_JMPZ
99
- || op_array -> opcodes [b -> start + 1 ].opcode == ZEND_JMPNZ )
100
- && (op_array -> opcodes [b -> start + 1 ].op1_type & (IS_CV |IS_CONST ))
98
+ && (opcodes [b -> start + 1 ].opcode == ZEND_JMPZ
99
+ || opcodes [b -> start + 1 ].opcode == ZEND_JMPNZ )
100
+ && (opcodes [b -> start + 1 ].op1_type & (IS_CV |IS_CONST ))
101
101
&& b -> start > 0
102
- && zend_is_smart_branch (op_array -> opcodes + b -> start - 1 )) {
102
+ && zend_is_smart_branch (opcodes + b -> start - 1 )) {
103
103
break ;
104
104
}
105
105
b -> start ++ ;
106
106
b -> len -- ;
107
- }
107
+ } while ( b -> len > 0 && opcodes [ b -> start ]. opcode == ZEND_NOP );
108
108
}
109
109
110
110
static void strip_nops (zend_op_array * op_array , zend_basic_block * b )
111
111
{
112
112
uint32_t i , j ;
113
113
114
- strip_leading_nops (op_array , b );
115
114
if (b -> len == 0 ) {
116
115
return ;
117
116
}
118
117
118
+ if (op_array -> opcodes [b -> start ].opcode == ZEND_NOP ) {
119
+ strip_leading_nops (op_array , b );
120
+ }
121
+
119
122
/* strip the inside NOPs */
120
123
i = j = b -> start + 1 ;
121
124
while (i < b -> start + b -> len ) {
@@ -168,8 +171,14 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
168
171
zend_op * opline , * src ;
169
172
zend_op * end , * last_op = NULL ;
170
173
171
- /* remove leading NOPs */
172
- strip_leading_nops (op_array , block );
174
+ if (block -> len == 0 ) {
175
+ return ;
176
+ }
177
+
178
+ if (op_array -> opcodes [block -> start ].opcode == ZEND_NOP ) {
179
+ /* remove leading NOPs */
180
+ strip_leading_nops (op_array , block );
181
+ }
173
182
174
183
opline = op_array -> opcodes + block -> start ;
175
184
end = opline + block -> len ;
0 commit comments