[llvm-commits] [llvm] r66976 - in /llvm/trunk: lib/CodeGen/PHIElimination.cpp lib/Transforms/Scalar/CodeGenPrepare.cpp test/CodeGen/X86/2009-03-13-PHIElimBug.ll test/CodeGen/X86/split-eh-lpad-edges.ll
Duncan Sands
baldrick at free.fr
Mon Mar 16 00:39:47 PDT 2009
Hi Evan,
> > %reg1031<def> = MOV32rr %EAX
> > EH_LABEL 2
> > %reg1025<def> = MOV32rr %reg1031 <= Invoke result, not an
> > EH_LABEL
> > JMP mbb<entry.cont_crit_edge,0xa11af90>
> >
> > So in this case the logic bails out, putting the copy at the end of
> > the BB,
> > even though it might still need to be before the invoke.
>
> Something seems wrong with this. Who inserted the copy? The copy from
> EAX to reg1031 is the copy lowered by isel. Is PHI elimination
> inserting the copy from reg1031 to reg1025? Then it should have done
> the right thing.
I'm not sure where it's coming from (see testcase below). By the way, what
do you think of the patch I sent? It's more efficient in the common case of
an invoke with one def/use of SrcReg in the basic block, but less efficient
when there is more than one def/use because it has to walk more of the basic
block.
Ciao,
Duncan.
Run: llc -march=x86 -f phi.bc
If I break on WalkPassEHTryRange, then the first time I hit the breakpoint
I see such a register copy after the EH_LABEL. This is the MBB for "cont",
and it is trying to find a place to put the copy for the phi node in the
landing pad.
declare i32 @f()
declare i32 @g()
define i32 @phi() {
entry:
%a = call i32 @f() ; <i32> [#uses=1]
%b = invoke i32 @g()
to label %cont unwind label %lpad ; <i32> [#uses=1]
cont: ; preds = %entry
%x = phi i32 [ %b, %entry ] ; <i32> [#uses=0]
%aa = call i32 @f() ; <i32> [#uses=1]
%bb = invoke i32 @g()
to label %cont2 unwind label %lpad ; <i32> [#uses=1]
cont2: ; preds = %cont
%xx = phi i32 [ %bb, %cont ] ; <i32> [#uses=1]
ret i32 %xx
lpad: ; preds = %cont, %entry
%y = phi i32 [ %a, %entry ], [ %aa, %cont ] ; <i32> [#uses=1]
ret i32 %y
}
More information about the llvm-commits
mailing list