mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Update IR
IR commit: cdf6e44c73d393794ad97b0487318f101c77f1bd
This commit is contained in:
parent
bf0abd1629
commit
a541b95a5e
1 changed files with 26 additions and 7 deletions
|
@ -2271,13 +2271,32 @@ restart:
|
|||
IR_ASSERT(src == ir_chain_head(chains, e->from) && chains[src].tail == e->from);
|
||||
if (src != dst) {
|
||||
ir_join_chains(chains, src, dst);
|
||||
} else if (ctx->ir_base[ctx->cfg_blocks[src].start].op == IR_LOOP_BEGIN
|
||||
&& ctx->ir_base[ctx->cfg_blocks[src].end].op == IR_IF
|
||||
&& ctx->ir_base[ctx->cfg_blocks[e->from].end].op == IR_LOOP_END) {
|
||||
/* rotate loop moving the loop condition to the end */
|
||||
uint32_t new_head = e->from;
|
||||
chains[src].head = new_head;
|
||||
chains[new_head].head = new_head;
|
||||
} else if (ctx->cfg_blocks[e->from].successors_count < 2) {
|
||||
/* Try to rotate loop chian to finish it with a conditional branch */
|
||||
uint32_t tail = e->from;
|
||||
uint32_t prev = src;
|
||||
uint32_t next = chains[prev].next;
|
||||
uint32_t best = 0;
|
||||
|
||||
while (prev != tail) {
|
||||
if (ctx->ir_base[ctx->cfg_blocks[prev].end].op == IR_IF) {
|
||||
if (ctx->ir_base[ctx->cfg_blocks[prev].start].op == IR_LOOP_BEGIN
|
||||
&& ctx->cfg_blocks[prev].loop_depth > 1) {
|
||||
best = next;
|
||||
break;
|
||||
} else if (!best || bb_freq[next] < bb_freq[best]) {
|
||||
/* Find the successor of IF with the least frequency */
|
||||
best = next;
|
||||
}
|
||||
}
|
||||
prev = next;
|
||||
next = chains[next].next;
|
||||
}
|
||||
if (best) {
|
||||
/* change the head of the chain */
|
||||
chains[src].head = best;
|
||||
chains[best].head = best;
|
||||
}
|
||||
}
|
||||
#if !IR_DEBUG_BB_SCHEDULE_GRAPH
|
||||
e->from = 0; /* reset "from" to avoid check on step #5 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue