@@ -1370,7 +1370,7 @@ static uint32_t zend_interval_intersection(zend_lifetime_interval *ival1, zend_l
1370
1370
1371
1371
/* See "Optimized Interval Splitting in a Linear Scan Register Allocator",
1372
1372
Christian Wimmer VEE'05 (2005), Figure 4. Allocation without spilling */
1373
- static int zend_jit_try_allocate_free_reg (const zend_op_array * op_array , zend_ssa * ssa , zend_lifetime_interval * current , zend_regset available , zend_regset * hints , zend_lifetime_interval * active , zend_lifetime_interval * inactive , zend_lifetime_interval * * list , zend_lifetime_interval * * free )
1373
+ static int zend_jit_try_allocate_free_reg (const zend_op_array * op_array , const zend_op * * ssa_opcodes , zend_ssa * ssa , zend_lifetime_interval * current , zend_regset available , zend_regset * hints , zend_lifetime_interval * active , zend_lifetime_interval * inactive , zend_lifetime_interval * * list , zend_lifetime_interval * * free )
1374
1374
{
1375
1375
zend_lifetime_interval * it ;
1376
1376
uint32_t freeUntilPos [ZREG_NUM ];
@@ -1403,7 +1403,9 @@ static int zend_jit_try_allocate_free_reg(const zend_op_array *op_array, zend_ss
1403
1403
while (it ) {
1404
1404
if (current -> range .start != zend_interval_end (it )) {
1405
1405
freeUntilPos [it -> reg ] = 0 ;
1406
- } else if (zend_jit_may_reuse_reg (op_array -> opcodes + current -> range .start , ssa -> ops + current -> range .start , ssa , current -> ssa_var , it -> ssa_var )) {
1406
+ } else if (zend_jit_may_reuse_reg (
1407
+ ssa_opcodes ? ssa_opcodes [current -> range .start ] : op_array -> opcodes + current -> range .start ,
1408
+ ssa -> ops + current -> range .start , ssa , current -> ssa_var , it -> ssa_var )) {
1407
1409
if (!ZEND_REGSET_IN (* hints , it -> reg ) &&
1408
1410
/* TODO: Avoid most often scratch registers. Find a better way ??? */
1409
1411
(!current -> used_as_hint ||
@@ -1468,7 +1470,7 @@ static int zend_jit_try_allocate_free_reg(const zend_op_array *op_array, zend_ss
1468
1470
}
1469
1471
while (line <= range -> end ) {
1470
1472
regset = zend_jit_get_scratch_regset (
1471
- op_array -> opcodes + line ,
1473
+ ssa_opcodes ? ssa_opcodes [ line ] : op_array -> opcodes + line ,
1472
1474
ssa -> ops + line ,
1473
1475
op_array , ssa , current -> ssa_var , line == last_use_line );
1474
1476
ZEND_REGSET_FOREACH (regset , reg ) {
@@ -1600,7 +1602,7 @@ static int zend_jit_allocate_blocked_reg(void)
1600
1602
1601
1603
/* See "Optimized Interval Splitting in a Linear Scan Register Allocator",
1602
1604
Christian Wimmer VEE'10 (2005), Figure 2. */
1603
- static zend_lifetime_interval * zend_jit_linear_scan (const zend_op_array * op_array , zend_ssa * ssa , zend_lifetime_interval * list )
1605
+ static zend_lifetime_interval * zend_jit_linear_scan (const zend_op_array * op_array , const zend_op * * ssa_opcodes , zend_ssa * ssa , zend_lifetime_interval * list )
1604
1606
{
1605
1607
zend_lifetime_interval * unhandled , * active , * inactive , * handled , * free ;
1606
1608
zend_lifetime_interval * current , * * p , * q ;
@@ -1659,7 +1661,7 @@ static zend_lifetime_interval* zend_jit_linear_scan(const zend_op_array *op_arra
1659
1661
}
1660
1662
}
1661
1663
1662
- if (zend_jit_try_allocate_free_reg (op_array , ssa , current , available , & hints , active , inactive , & unhandled , & free ) ||
1664
+ if (zend_jit_try_allocate_free_reg (op_array , ssa_opcodes , ssa , current , available , & hints , active , inactive , & unhandled , & free ) ||
1663
1665
zend_jit_allocate_blocked_reg ()) {
1664
1666
ZEND_REGSET_EXCL (available , current -> reg );
1665
1667
current -> list_next = active ;
@@ -1792,7 +1794,7 @@ static zend_lifetime_interval** zend_jit_allocate_registers(const zend_op_array
1792
1794
}
1793
1795
1794
1796
/* Linear Scan Register Allocation */
1795
- list = zend_jit_linear_scan (op_array , ssa , list );
1797
+ list = zend_jit_linear_scan (op_array , NULL , ssa , list );
1796
1798
1797
1799
if (list ) {
1798
1800
intervals = zend_arena_calloc (& CG (arena ), ssa -> vars_count , sizeof (zend_lifetime_interval * ));
@@ -2132,7 +2134,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2132
2134
}
2133
2135
}
2134
2136
if (ssa -> cfg .blocks [b ].flags & ZEND_BB_LOOP_HEADER ) {
2135
- if (!zend_jit_check_timeout (& dasm_state , op_array -> opcodes + ssa -> cfg .blocks [b ].start )) {
2137
+ if (!zend_jit_check_timeout (& dasm_state , op_array -> opcodes + ssa -> cfg .blocks [b ].start , NULL )) {
2136
2138
goto jit_failure ;
2137
2139
}
2138
2140
}
0 commit comments