27
27
#include "zend_vm.h"
28
28
#include "zend_bitset.h"
29
29
30
+ #define INVALID_VAR ((uint32_t)-1)
30
31
#define GET_AVAILABLE_T () \
31
32
for (i = 0; i < T; i++) { \
32
33
if (!zend_bitset_in(taken_T, i)) { \
@@ -45,7 +46,6 @@ void zend_optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_c
45
46
uint32_t bitset_len ;
46
47
zend_bitset taken_T ; /* T index in use */
47
48
zend_op * * start_of_T ; /* opline where T is first used */
48
- zend_bitset valid_T ; /* Is the map_T valid */
49
49
int * map_T ; /* Map's the T to its new index */
50
50
zend_op * opline , * end ;
51
51
int currT ;
@@ -56,8 +56,8 @@ void zend_optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_c
56
56
bitset_len = zend_bitset_len (T );
57
57
taken_T = (zend_bitset ) zend_arena_alloc (& ctx -> arena , bitset_len * ZEND_BITSET_ELM_SIZE );
58
58
start_of_T = (zend_op * * ) zend_arena_alloc (& ctx -> arena , T * sizeof (zend_op * ));
59
- valid_T = (zend_bitset ) zend_arena_alloc (& ctx -> arena , bitset_len * ZEND_BITSET_ELM_SIZE );
60
59
map_T = (int * ) zend_arena_alloc (& ctx -> arena , T * sizeof (int ));
60
+ memset (map_T , 0xff , T * sizeof (int ));
61
61
62
62
end = op_array -> opcodes ;
63
63
opline = & op_array -> opcodes [op_array -> last - 1 ];
@@ -70,7 +70,6 @@ void zend_optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_c
70
70
opline -- ;
71
71
}
72
72
73
- zend_bitset_clear (valid_T , bitset_len );
74
73
zend_bitset_clear (taken_T , bitset_len );
75
74
76
75
end = op_array -> opcodes ;
@@ -90,15 +89,14 @@ void zend_optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_c
90
89
max = MAX (max , var + num );
91
90
var = var + 1 ;
92
91
map_T [currT ] = var ;
93
- zend_bitset_incl (valid_T , currT );
94
92
zend_bitset_incl (taken_T , var );
95
93
opline -> op1 .var = NUM_VAR (var + offset );
96
94
while (num > 1 ) {
97
95
num -- ;
98
96
zend_bitset_incl (taken_T , var + num );
99
97
}
100
98
} else {
101
- if (! zend_bitset_in ( valid_T , currT ) ) {
99
+ if (map_T [ currT ] == INVALID_VAR ) {
102
100
int use_new_var = 0 ;
103
101
104
102
/* Code in "finally" blocks may modify temporary variables.
@@ -132,29 +130,26 @@ void zend_optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_c
132
130
GET_AVAILABLE_T ();
133
131
}
134
132
map_T [currT ] = i ;
135
- zend_bitset_incl (valid_T , currT );
136
133
}
137
134
opline -> op1 .var = NUM_VAR (map_T [currT ] + offset );
138
135
}
139
136
}
140
137
141
138
if ((opline -> op2_type & (IS_VAR | IS_TMP_VAR ))) {
142
139
currT = VAR_NUM (opline -> op2 .var ) - offset ;
143
- if (! zend_bitset_in ( valid_T , currT ) ) {
140
+ if (map_T [ currT ] == INVALID_VAR ) {
144
141
GET_AVAILABLE_T ();
145
142
map_T [currT ] = i ;
146
- zend_bitset_incl (valid_T , currT );
147
143
}
148
144
opline -> op2 .var = NUM_VAR (map_T [currT ] + offset );
149
145
}
150
146
151
147
if (opline -> result_type & (IS_VAR | IS_TMP_VAR )) {
152
148
currT = VAR_NUM (opline -> result .var ) - offset ;
153
- if (! zend_bitset_in ( valid_T , currT ) ) {
149
+ if (map_T [ currT ] == INVALID_VAR ) {
154
150
/* As a result of DCE, an opcode may have an unused result. */
155
151
GET_AVAILABLE_T ();
156
152
map_T [currT ] = i ;
157
- zend_bitset_incl (valid_T , currT );
158
153
}
159
154
opline -> result .var = NUM_VAR (map_T [currT ] + offset );
160
155
if (start_of_T [currT ] == opline ) {
0 commit comments