diff --git a/mach/proto/mcg/pass_convertstackops.c b/mach/proto/mcg/pass_convertstackops.c index 59290d376..49da42226 100644 --- a/mach/proto/mcg/pass_convertstackops.c +++ b/mach/proto/mcg/pass_convertstackops.c @@ -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; ju.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; ju.phivalue, + pushes.item[j].left, + pushes.item[j].right); + } + phi->root = phi; + *ir = *phi; + } } } }