[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / Inline / invoke_test-2.ll
blobac1822b9bfcd3d3960590b8cdb1c97b8975aa834
1 ; Test that if an invoked function is inlined, and if that function cannot
2 ; throw, that the dead handler is now unreachable.
4 ; RUN: opt < %s -inline -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
6 declare void @might_throw()
8 define internal i32 @callee() personality i32 (...)* @__gxx_personality_v0 {
9 enrty:
10   invoke void @might_throw()
11       to label %cont unwind label %exc
13 cont:
14   ret i32 0
16 exc:
17   %exn = landingpad {i8*, i32}
18          cleanup
19   ret i32 1
22 ; caller returns true if might_throw throws an exception... callee cannot throw.
23 define i32 @caller() personality i32 (...)* @__gxx_personality_v0 {
24 ; CHECK-LABEL: define i32 @caller() personality i32 (...)* @__gxx_personality_v0
25 enrty:
26   %X = invoke i32 @callee()
27            to label %cont unwind label %UnreachableExceptionHandler
28 ; CHECK-NOT: @callee
29 ; CHECK: invoke void @might_throw()
30 ; CHECK:     to label %[[C:.*]] unwind label %[[E:.*]]
32 ; CHECK: [[E]]:
33 ; CHECK:   landingpad
34 ; CHECK:      cleanup
35 ; CHECK:   br label %[[C]]
37 cont:
38 ; CHECK: [[C]]:
39   ret i32 %X
40 ; CHECK:   %[[PHI:.*]] = phi i32
41 ; CHECK:   ret i32 %[[PHI]]
43 UnreachableExceptionHandler:
44 ; CHECK-NOT: UnreachableExceptionHandler:
45   %exn = landingpad {i8*, i32}
46          cleanup
47   ret i32 -1
48 ; CHECK-NOT: ret i32 -1
50 ; CHECK: }
52 declare i32 @__gxx_personality_v0(...)