Don't generate phis if unnecessary (because this breaks the
critical-edge-splitting guarantee and causes insertion of phi copies to fail).
This commit is contained in:
parent
658db4ba71
commit
bfa65168e2
|
@ -95,15 +95,31 @@ static void convert_block(struct basicblock* bb)
|
|||
{
|
||||
struct basicblock* outbb = pops.item[i].left;
|
||||
struct ir* ir = pops.item[i].right;
|
||||
struct ir* phi = new_ir0(IR_PHI, ir->size);
|
||||
|
||||
for (j=0; j<pushes.count; j++)
|
||||
pmap_add(&phi->u.phivalue,
|
||||
pushes.item[j].left,
|
||||
pushes.item[j].right);
|
||||
phi->root = phi;
|
||||
assert(pushes.count > 0);
|
||||
if (pushes.count == 1)
|
||||
{
|
||||
/* The push happened in exactly one place; that means we don't need a phi and can
|
||||
* just import the value directly. */
|
||||
|
||||
*ir = *phi;
|
||||
struct ir* src = pushes.item[0].right;
|
||||
ir->opcode = IR_NOP;
|
||||
ir->left = src;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The push could have happened in one of several places; we need a phi. */
|
||||
|
||||
struct ir* phi = new_ir0(IR_PHI, ir->size);
|
||||
for (j=0; j<pushes.count; j++)
|
||||
{
|
||||
pmap_add(&phi->u.phivalue,
|
||||
pushes.item[j].left,
|
||||
pushes.item[j].right);
|
||||
}
|
||||
phi->root = phi;
|
||||
*ir = *phi;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue