Skip to content

Commit ea15909

Browse files
committed
Improve register allocator (give preference to loop variables).
1 parent 87d2bb7 commit ea15909

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

ext/opcache/jit/zend_jit.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,7 @@ static zend_lifetime_interval *zend_jit_sort_intervals(zend_lifetime_interval **
964964
if (ival) {
965965
if ((ival->range.start > last->range.start) ||
966966
(ival->range.start == last->range.start &&
967-
((!ival->hint && last->hint) ||
967+
((!ival->hint && last->hint && last->hint != ival) ||
968968
ival->range.end > last->range.end))) {
969969
last->list_next = ival;
970970
last = ival;
@@ -979,7 +979,7 @@ static zend_lifetime_interval *zend_jit_sort_intervals(zend_lifetime_interval **
979979
break;
980980
} else if ((ival->range.start < (*p)->range.start) ||
981981
(ival->range.start == (*p)->range.start &&
982-
((ival->hint && !(*p)->hint) ||
982+
((ival->hint && !(*p)->hint && ival->hint != *p) ||
983983
ival->range.end < (*p)->range.end))) {
984984
ival->list_next = *p;
985985
*p = ival;

ext/opcache/jit/zend_jit_trace.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2641,12 +2641,26 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
26412641
intervals[ssa->ops[line].op1_use] &&
26422642
ssa->ops[line].op1_use_chain < 0 &&
26432643
!ssa->vars[ssa->ops[line].op1_use].phi_use_chain) {
2644+
2645+
zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op1_use].definition_phi;
2646+
if (phi &&
2647+
intervals[phi->sources[1]] &&
2648+
intervals[phi->sources[1]]->hint == intervals[ssa->ops[line].op1_use]) {
2649+
break;
2650+
}
26442651
zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use);
26452652
} else if (opline->opcode != ZEND_SUB &&
26462653
ssa->ops[line].op2_use >= 0 &&
26472654
intervals[ssa->ops[line].op2_use] &&
26482655
ssa->ops[line].op2_use_chain < 0 &&
26492656
!ssa->vars[ssa->ops[line].op2_use].phi_use_chain) {
2657+
2658+
zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op2_use].definition_phi;
2659+
if (phi &&
2660+
intervals[phi->sources[1]] &&
2661+
intervals[phi->sources[1]]->hint == intervals[ssa->ops[line].op2_use]) {
2662+
break;
2663+
}
26502664
zend_jit_add_hint(intervals, i, ssa->ops[line].op2_use);
26512665
}
26522666
}

0 commit comments

Comments
 (0)