mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-11 07:24:06 +00:00
dfec24c877
how invokes are set up. The fix could be disturbed by register copies coming after the EH_LABEL, and also didn't behave quite right when it was the invoke result that was used in a phi node. Also (see new testcase) fix another phi elimination bug while there: register copies in the landing pad need to come after the EH_LABEL, because that's where execution branches to when unwinding. If they come before the EH_LABEL then they will never be executed... Also tweak the original testcase so it doesn't use a no-longer existing counter. The accumulated phi elimination changes fix two of seven Ada testsuite failures that turned up after landing pad critical edge splitting was turned off. So there's probably more to come. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67049 91177308-0d34-0410-b5e6-96231b3b80d8
29 lines
727 B
LLVM
29 lines
727 B
LLVM
; RUN: llvm-as < %s | llc -march=x86 | grep -A 2 {call f} | grep movl
|
|
; Check the register copy comes after the call to f and before the call to g
|
|
; PR3784
|
|
|
|
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 @g() ; <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
|
|
}
|