mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
eea7082b7d
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
57 lines
1.4 KiB
LLVM
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
|