llvm/test/CodeGen/X86/pr27501.ll
David Majnemer e7edf2d8d2 [WinEH] Update SplitAnalysis::computeLastSplitPoint to cope with multiple EH successors
We didn't have logic to correctly handle CFGs where there was more than
one EH-pad successor (these are novel with WinEH).
There were situations where a register was live in one exceptional
successor but not another but the code as written would only consider
the first exceptional successor it found.

This resulted in split points which were insufficiently early if an
invoke was present.

This fixes PR27501.

N.B.  This removes getLandingPadSuccessor.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267412 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-25 14:31:32 +00:00

68 lines
2.5 KiB
LLVM

; RUN: llc < %s | FileCheck %s
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"
define void @test1(i64* %result.repack) personality i32 (...)* @__CxxFrameHandler3 {
bb:
invoke void @may_throw(i32 1)
to label %postinvoke unwind label %cleanuppad
; CHECK: movl $1, %ecx
; CHECK: callq may_throw
postinvoke: ; preds = %bb
store i64 19, i64* %result.repack, align 8
; CHECK: movq $19, (%rsi)
; CHECK: movl $2, %ecx
; CHECK-NEXT: movq %rsi, -8(%rbp)
; CHECK-NEXT: callq may_throw
invoke void @may_throw(i32 2)
to label %assertFailed unwind label %catch.dispatch
catch.dispatch: ; preds = %cleanuppad9, %postinvoke
%tmp3 = catchswitch within none [label %catch.object.Throwable] unwind label %cleanuppad
catch.object.Throwable: ; preds = %catch.dispatch
%tmp2 = catchpad within %tmp3 [i8* null, i32 64, i8* null]
catchret from %tmp2 to label %catchhandler
catchhandler: ; preds = %catch.object.Throwable
invoke void @may_throw(i32 3)
to label %try.success.or.caught unwind label %cleanuppad
try.success.or.caught: ; preds = %catchhandler
invoke void @may_throw(i32 4)
to label %postinvoke27 unwind label %cleanuppad24
; CHECK: movl $4, %ecx
; CHECK-NEXT: callq may_throw
postinvoke27: ; preds = %try.success.or.caught
store i64 42, i64* %result.repack, align 8
; CHECK: movq -8(%rbp), %[[reload:r..]]
; CHECK-NEXT: movq $42, (%[[reload]])
ret void
cleanuppad24: ; preds = %try.success.or.caught
%tmp5 = cleanuppad within none []
cleanupret from %tmp5 unwind to caller
cleanuppad: ; preds = %catchhandler, %catch.dispatch, %bb
%tmp1 = cleanuppad within none []
cleanupret from %tmp1 unwind to caller
assertFailed: ; preds = %postinvoke
invoke void @may_throw(i32 5)
to label %postinvoke13 unwind label %cleanuppad9
postinvoke13: ; preds = %assertFailed
unreachable
cleanuppad9: ; preds = %assertFailed
%tmp4 = cleanuppad within none []
cleanupret from %tmp4 unwind label %catch.dispatch
}
declare void @may_throw(i32)
declare i32 @__CxxFrameHandler3(...)