@@ -348,16 +348,18 @@ static zend_always_inline uint32_t zend_jit_trace_type_to_info(zend_uchar type)
348
348
return zend_jit_trace_type_to_info_ex (type , -1 );
349
349
}
350
350
351
- static zend_always_inline int zend_jit_var_may_be_modified_indirectly (const zend_op_array * op_array , const zend_ssa * ssa , uint32_t var )
351
+ static zend_always_inline zend_ssa_alias_kind zend_jit_var_may_alias (const zend_op_array * op_array , const zend_ssa * ssa , uint32_t var )
352
352
{
353
- if ((!op_array -> function_name || (ssa -> cfg .flags & ZEND_FUNC_INDIRECT_VAR_ACCESS ))
354
- && var < op_array -> last_var ) {
355
- return 1 ;
356
- } else if (var < op_array -> last_var
357
- && zend_string_equals_literal (op_array -> vars [var ], "http_response_header" )) {
358
- return 1 ;
359
- }
360
- return 0 ;
353
+ if (var >= op_array -> last_var ) {
354
+ return NO_ALIAS ;
355
+ } else if ((!op_array -> function_name || (ssa -> cfg .flags & ZEND_FUNC_INDIRECT_VAR_ACCESS ))) {
356
+ return SYMTABLE_ALIAS ;
357
+ } else if (ssa -> vars ) {
358
+ return ssa -> vars [var ].alias ;
359
+ } else if (zend_string_equals_literal (op_array -> vars [var ], "http_response_header" )) {
360
+ return HTTP_RESPONSE_HEADER_ALIAS ;
361
+ }
362
+ return NO_ALIAS ;
361
363
}
362
364
363
365
#define STACK_VAR_TYPE (_var ) \
@@ -378,7 +380,7 @@ static zend_always_inline void zend_jit_trace_add_op_guard(const zend_op_array
378
380
{
379
381
zend_ssa_var_info * info = & tssa -> var_info [ssa_var ];
380
382
381
- if (zend_jit_var_may_be_modified_indirectly (op_array , ssa , EX_VAR_TO_NUM (var ))) {
383
+ if (zend_jit_var_may_alias (op_array , ssa , EX_VAR_TO_NUM (var )) != NO_ALIAS ) {
382
384
info -> type = MAY_BE_GUARD | zend_jit_trace_type_to_info (op_type );
383
385
} else if ((info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) != (1 << op_type )) {
384
386
info -> type = MAY_BE_GUARD | zend_jit_trace_type_to_info_ex (op_type , info -> type );
@@ -398,7 +400,7 @@ static zend_always_inline void zend_jit_trace_add_op_guard(const zend_op_array
398
400
if (!zend_jit_type_guard(&dasm_state, opline, _var, op_type)) { \
399
401
goto jit_failure; \
400
402
} \
401
- if (zend_jit_var_may_be_modified_indirectly (op_array, op_array_ssa, _var)) { \
403
+ if (zend_jit_var_may_alias (op_array, op_array_ssa, _var) != NO_ALIAS ) { \
402
404
SET_STACK_VAR_TYPE(_var, IS_UNKNOWN); \
403
405
} else { \
404
406
SET_STACK_VAR_TYPE(_var, op_type); \
@@ -1288,7 +1290,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1288
1290
ssa_var_info [i ].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF ;
1289
1291
}
1290
1292
} else if (op_array -> function_name
1291
- && ! zend_jit_var_may_be_modified_indirectly (op_array , ssa , i )) {
1293
+ && zend_jit_var_may_alias (op_array , ssa , i ) == NO_ALIAS ) {
1292
1294
ssa_vars [i ].no_val = ssa -> vars ? ssa -> vars [i ].no_val : 0 ;
1293
1295
ssa_var_info [i ].type = MAY_BE_UNDEF ;
1294
1296
} else {
@@ -1797,7 +1799,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1797
1799
ssa_var_info [v ].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF ;
1798
1800
}
1799
1801
} else if (op_array -> function_name
1800
- && ! zend_jit_var_may_be_modified_indirectly (op_array , ssa , i )) {
1802
+ && zend_jit_var_may_alias (op_array , ssa , i ) == NO_ALIAS ) {
1801
1803
ssa_vars [v ].no_val = ssa -> vars ? ssa -> vars [i ].no_val : 0 ;
1802
1804
ssa_var_info [v ].type = MAY_BE_UNDEF ;
1803
1805
} else {
@@ -1917,7 +1919,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1917
1919
uint32_t t1 = ssa_var_info [phi -> sources [1 ]].type ;
1918
1920
1919
1921
if (t & MAY_BE_GUARD ) {
1920
- if (zend_jit_var_may_be_modified_indirectly (op_array , ssa , phi -> sources [0 ])) {
1922
+ if (zend_jit_var_may_alias (op_array , ssa , phi -> sources [0 ]) != NO_ALIAS ) {
1921
1923
/* pass */
1922
1924
} else if (((t0 | t1 ) & (MAY_BE_ANY |MAY_BE_UNDEF |MAY_BE_REF )) == (t & (MAY_BE_ANY |MAY_BE_UNDEF |MAY_BE_REF ))) {
1923
1925
if (!((t0 | t1 ) & MAY_BE_GUARD )) {
@@ -2082,7 +2084,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2082
2084
/* We don't start intervals for variables used in Phi */
2083
2085
if ((ssa -> vars [i ].use_chain >= 0 /*|| ssa->vars[i].phi_use_chain*/ )
2084
2086
&& zend_jit_var_supports_reg (ssa , i )
2085
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , i )) {
2087
+ && zend_jit_var_may_alias (op_array , op_array_ssa , i ) == NO_ALIAS ) {
2086
2088
start [i ] = 0 ;
2087
2089
if (i < parent_vars_count
2088
2090
&& STACK_REG (parent_stack , i ) != ZREG_NONE
@@ -2113,7 +2115,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2113
2115
vars_op_array [phi -> ssa_var ] = op_array ;
2114
2116
if (ssa -> vars [phi -> ssa_var ].use_chain >= 0
2115
2117
&& zend_jit_var_supports_reg (ssa , phi -> ssa_var )
2116
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , phi -> sources [0 ])) {
2118
+ && zend_jit_var_may_alias (op_array , op_array_ssa , phi -> sources [0 ]) == NO_ALIAS ) {
2117
2119
start [phi -> ssa_var ] = 0 ;
2118
2120
count ++ ;
2119
2121
}
@@ -2211,7 +2213,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2211
2213
&& (ssa -> vars [ssa_op -> result_def ].use_chain >= 0
2212
2214
|| ssa -> vars [ssa_op -> result_def ].phi_use_chain )
2213
2215
&& zend_jit_var_supports_reg (ssa , ssa_op -> result_def )
2214
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> result .var ))) {
2216
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> result .var )) == NO_ALIAS ) {
2215
2217
if (!(ssa -> var_info [ssa_op -> result_def ].type & MAY_BE_GUARD )
2216
2218
|| opline -> opcode == ZEND_PRE_INC
2217
2219
|| opline -> opcode == ZEND_PRE_DEC
@@ -2233,7 +2235,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2233
2235
&& (ssa -> vars [ssa_op -> op1_def ].use_chain >= 0
2234
2236
|| ssa -> vars [ssa_op -> op1_def ].phi_use_chain )
2235
2237
&& zend_jit_var_supports_reg (ssa , ssa_op -> op1_def )
2236
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
2238
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var )) == NO_ALIAS ) {
2237
2239
start [ssa_op -> op1_def ] = idx ;
2238
2240
vars_op_array [ssa_op -> op1_def ] = op_array ;
2239
2241
count ++ ;
@@ -2242,7 +2244,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2242
2244
&& (ssa -> vars [ssa_op -> op2_def ].use_chain >= 0
2243
2245
|| ssa -> vars [ssa_op -> op2_def ].phi_use_chain )
2244
2246
&& zend_jit_var_supports_reg (ssa , ssa_op -> op2_def )
2245
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op2 .var ))) {
2247
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op2 .var )) == NO_ALIAS ) {
2246
2248
start [ssa_op -> op2_def ] = idx ;
2247
2249
vars_op_array [ssa_op -> op2_def ] = op_array ;
2248
2250
count ++ ;
@@ -2283,7 +2285,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2283
2285
&& (ssa -> vars [ssa_op -> op1_def ].use_chain >= 0
2284
2286
|| ssa -> vars [ssa_op -> op1_def ].phi_use_chain )
2285
2287
&& zend_jit_var_supports_reg (ssa , ssa_op -> op1_def )
2286
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
2288
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var )) == NO_ALIAS ) {
2287
2289
start [ssa_op -> op1_def ] = idx ;
2288
2290
vars_op_array [ssa_op -> op1_def ] = op_array ;
2289
2291
count ++ ;
@@ -2346,7 +2348,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2346
2348
vars_op_array [j ] = op_array ;
2347
2349
if (ssa -> vars [j ].use_chain >= 0
2348
2350
&& zend_jit_var_supports_reg (ssa , j )
2349
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , i )) {
2351
+ && zend_jit_var_may_alias (op_array , op_array_ssa , i ) == NO_ALIAS ) {
2350
2352
start [j ] = idx ;
2351
2353
flags [j ] = ZREG_LOAD ;
2352
2354
count ++ ;
@@ -2378,7 +2380,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2378
2380
vars_op_array [j ] = op_array ;
2379
2381
if (ssa -> vars [j ].use_chain >= 0
2380
2382
&& zend_jit_var_supports_reg (ssa , j )
2381
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , i )) {
2383
+ && zend_jit_var_may_alias (op_array , op_array_ssa , i ) == NO_ALIAS ) {
2382
2384
start [j ] = idx ;
2383
2385
flags [j ] = ZREG_LOAD ;
2384
2386
count ++ ;
@@ -3023,7 +3025,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3023
3025
3024
3026
if (!(info & MAY_BE_GUARD ) && has_concrete_type (info )) {
3025
3027
SET_STACK_TYPE (stack , i , concrete_type (info ));
3026
- } else if (zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , i )) {
3028
+ } else if (zend_jit_var_may_alias (op_array , op_array_ssa , i ) != NO_ALIAS ) {
3027
3029
SET_STACK_TYPE (stack , i , IS_UNKNOWN );
3028
3030
} else if (i < parent_vars_count
3029
3031
&& STACK_TYPE (parent_stack , i ) != IS_UNKNOWN ) {
@@ -3504,7 +3506,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3504
3506
goto jit_failure ;
3505
3507
}
3506
3508
if (opline -> op1_type == IS_CV
3507
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
3509
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var )) == NO_ALIAS ) {
3508
3510
ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
3509
3511
}
3510
3512
} else {
@@ -3535,7 +3537,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3535
3537
goto jit_failure ;
3536
3538
}
3537
3539
if (opline -> op1_type == IS_CV
3538
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
3540
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var )) == NO_ALIAS ) {
3539
3541
ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
3540
3542
}
3541
3543
} else {
@@ -3583,7 +3585,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3583
3585
goto jit_failure ;
3584
3586
}
3585
3587
if (opline -> op1_type == IS_CV
3586
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
3588
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var )) == NO_ALIAS ) {
3587
3589
ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
3588
3590
}
3589
3591
if (!zend_jit_assign_to_typed_ref (& dasm_state , opline , opline -> op2_type , op2_addr , 1 )) {
@@ -4029,7 +4031,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4029
4031
goto jit_failure ;
4030
4032
}
4031
4033
if (opline -> op1_type == IS_CV
4032
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
4034
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var )) == NO_ALIAS ) {
4033
4035
ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
4034
4036
}
4035
4037
} else {
@@ -4074,7 +4076,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4074
4076
goto jit_failure ;
4075
4077
}
4076
4078
if (opline -> op1_type == IS_CV
4077
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
4079
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var )) == NO_ALIAS ) {
4078
4080
ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
4079
4081
}
4080
4082
} else {
@@ -4121,7 +4123,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4121
4123
goto jit_failure ;
4122
4124
}
4123
4125
if (opline -> op1_type == IS_CV
4124
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
4126
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var )) == NO_ALIAS ) {
4125
4127
ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
4126
4128
}
4127
4129
} else {
@@ -4222,7 +4224,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4222
4224
goto jit_failure ;
4223
4225
}
4224
4226
if (opline -> op1_type == IS_CV
4225
- && ! zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
4227
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var )) == NO_ALIAS ) {
4226
4228
ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
4227
4229
}
4228
4230
} else {
@@ -4736,7 +4738,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4736
4738
}
4737
4739
while (i < p -> op_array -> last_var ) {
4738
4740
if (jit_extension
4739
- && zend_jit_var_may_be_modified_indirectly (p -> op_array , & jit_extension -> func_info .ssa , i )) {
4741
+ && zend_jit_var_may_alias (p -> op_array , & jit_extension -> func_info .ssa , i ) != NO_ALIAS ) {
4740
4742
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN );
4741
4743
} else {
4742
4744
SET_STACK_TYPE (call -> stack , i , IS_UNDEF );
0 commit comments