Move the personality function from LandingPadInst to Function
[oota-llvm.git] / test / Transforms / SimplifyCFG / duplicate-landingpad.ll
1 ; RUN: opt < %s -simplifycfg -S | FileCheck %s
2 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
3
4 declare i32 @__gxx_personality_v0(...)
5 declare void @fn()
6
7
8 ; CHECK-LABEL: @test1
9 define void @test1() personality i32 (...)* @__gxx_personality_v0 {
10 entry:
11 ; CHECK-LABEL: entry:
12 ; CHECK: to label %invoke2 unwind label %lpad2
13   invoke void @fn()
14     to label %invoke2 unwind label %lpad1
15
16 invoke2:
17 ; CHECK-LABEL: invoke2:
18 ; CHECK: to label %invoke.cont unwind label %lpad2
19   invoke void @fn()
20     to label %invoke.cont unwind label %lpad2
21
22 invoke.cont:
23   ret void
24
25 lpad1:
26   %exn = landingpad {i8*, i32}
27          cleanup
28   br label %shared_resume
29
30 lpad2:
31 ; CHECK-LABEL: lpad2:
32 ; CHECK: landingpad { i8*, i32 }
33 ; CHECK-NEXT: cleanup
34 ; CHECK-NEXT: call void @fn()
35 ; CHECK-NEXT: ret void
36   %exn2 = landingpad {i8*, i32}
37           cleanup
38   br label %shared_resume
39
40 shared_resume:
41   call void @fn()
42   ret void
43 }
44
45 ; Don't trigger if blocks aren't the same/empty
46 define void @neg1() personality i32 (...)* @__gxx_personality_v0 {
47 ; CHECK-LABEL: @neg1
48 entry:
49 ; CHECK-LABEL: entry:
50 ; CHECK: to label %invoke2 unwind label %lpad1
51   invoke void @fn()
52     to label %invoke2 unwind label %lpad1
53
54 invoke2:
55 ; CHECK-LABEL: invoke2:
56 ; CHECK: to label %invoke.cont unwind label %lpad2
57   invoke void @fn()
58     to label %invoke.cont unwind label %lpad2
59
60 invoke.cont:
61   ret void
62
63 lpad1:
64   %exn = landingpad {i8*, i32}
65          filter [0 x i8*] zeroinitializer
66   call void @fn()
67   br label %shared_resume
68
69 lpad2:
70   %exn2 = landingpad {i8*, i32}
71           cleanup
72   br label %shared_resume
73
74 shared_resume:
75   call void @fn()
76   ret void
77 }
78
79 ; Should not trigger when the landing pads are not the exact same
80 define void @neg2() personality i32 (...)* @__gxx_personality_v0 {
81 ; CHECK-LABEL: @neg2
82 entry:
83 ; CHECK-LABEL: entry:
84 ; CHECK: to label %invoke2 unwind label %lpad1
85   invoke void @fn()
86     to label %invoke2 unwind label %lpad1
87
88 invoke2:
89 ; CHECK-LABEL: invoke2:
90 ; CHECK: to label %invoke.cont unwind label %lpad2
91   invoke void @fn()
92     to label %invoke.cont unwind label %lpad2
93
94 invoke.cont:
95   ret void
96
97 lpad1:
98   %exn = landingpad {i8*, i32}
99          filter [0 x i8*] zeroinitializer
100   br label %shared_resume
101
102 lpad2:
103   %exn2 = landingpad {i8*, i32}
104           cleanup
105   br label %shared_resume
106
107 shared_resume:
108   call void @fn()
109   ret void
110 }