1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00
Sergey Dmitriev eea7082b7d [CodeExtractor] Allow extracting blocks with exception handling
This is a CodeExtractor improvement which adds support for extracting blocks
which have exception handling constructs if that is legal to do. CodeExtractor
performs validation checks to ensure that extraction is legal when it finds
invoke instructions or EH pads (landingpad, catchswitch, or cleanuppad) in
blocks to be extracted.

I have also added an option to allow extraction of blocks with alloca
instructions, but no validation is done for allocas. CodeExtractor caller has
to validate it himself before allowing alloca instructions to be extracted.
By default allocas are still not allowed in extraction blocks.

Differential Revision: https://reviews.llvm.org/D45904

llvm-svn: 332151
2018-05-11 22:49:49 +00:00

57 lines
1.4 KiB
LLVM

; RUN: opt < %s -skip-partial-inlining-cost-analysis -partial-inliner -S | FileCheck %s
; RUN: opt < %s -skip-partial-inlining-cost-analysis -passes=partial-inliner -S | FileCheck %s
declare dso_local void @bar()
declare dso_local i32 @__CxxFrameHandler3(...)
define internal void @callee(i1 %cond) personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
entry:
br i1 %cond, label %if.then, label %if.end
if.then:
invoke void @bar()
to label %invoke.cont unwind label %ehcleanup
invoke.cont:
br label %try.cont
ehcleanup:
%0 = cleanuppad within none []
cleanupret from %0 unwind label %catch.dispatch
catch.dispatch:
%1 = catchswitch within none [label %catch] unwind to caller
catch:
%2 = catchpad within %1 [i8* null, i32 64, i8* null]
catchret from %2 to label %catchret.dest
catchret.dest:
br label %try.cont
try.cont:
br label %if.end
if.end:
ret void
}
define internal void @caller(i1 %cond) {
; CHECK-LABEL: define {{.*}} @caller
entry:
; CHECK: entry:
; CHECK-NEXT: br i1
; CHECK: codeRepl.i:
; CHECK-NEXT: call void @callee.1_{{.*}}()
call void @callee(i1 %cond)
ret void
}
; CHECK-LABEL: define {{.*}} @callee.1_{{.*}}() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*)
; CHECK: invoke void @bar()
; CHECK: cleanuppad
; CHECK-NEXT: cleanupret
; CHECK: catchswitch
; CHECK: catchpad
; CHECK-NEXT: catchret