blob: 93c55f0064ccb85b6d22e79be9ff583a15b3e438 [file] [log] [blame]
Philip Reames2b969d72015-03-24 22:28:45 +00001; RUN: opt < %s -simplifycfg -S | FileCheck %s
2target 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
4declare i32 @__gxx_personality_v0(...)
5declare void @fn()
6
7
8; CHECK-LABEL: @test1
David Majnemer7fddecc2015-06-17 20:52:32 +00009define void @test1() personality i32 (...)* @__gxx_personality_v0 {
Philip Reames2b969d72015-03-24 22:28:45 +000010entry:
11; CHECK-LABEL: entry:
12; CHECK: to label %invoke2 unwind label %lpad2
13 invoke void @fn()
14 to label %invoke2 unwind label %lpad1
15
16invoke2:
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
22invoke.cont:
23 ret void
24
25lpad1:
David Majnemer7fddecc2015-06-17 20:52:32 +000026 %exn = landingpad {i8*, i32}
Philip Reames2b969d72015-03-24 22:28:45 +000027 cleanup
28 br label %shared_resume
29
30lpad2:
31; CHECK-LABEL: lpad2:
David Majnemer7fddecc2015-06-17 20:52:32 +000032; CHECK: landingpad { i8*, i32 }
Philip Reames2b969d72015-03-24 22:28:45 +000033; CHECK-NEXT: cleanup
34; CHECK-NEXT: call void @fn()
35; CHECK-NEXT: ret void
David Majnemer7fddecc2015-06-17 20:52:32 +000036 %exn2 = landingpad {i8*, i32}
Philip Reames2b969d72015-03-24 22:28:45 +000037 cleanup
38 br label %shared_resume
39
40shared_resume:
41 call void @fn()
42 ret void
43}
44
45; Don't trigger if blocks aren't the same/empty
David Majnemer7fddecc2015-06-17 20:52:32 +000046define void @neg1() personality i32 (...)* @__gxx_personality_v0 {
Philip Reames2b969d72015-03-24 22:28:45 +000047; CHECK-LABEL: @neg1
48entry:
49; CHECK-LABEL: entry:
50; CHECK: to label %invoke2 unwind label %lpad1
51 invoke void @fn()
52 to label %invoke2 unwind label %lpad1
53
54invoke2:
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
60invoke.cont:
61 ret void
62
63lpad1:
David Majnemer7fddecc2015-06-17 20:52:32 +000064 %exn = landingpad {i8*, i32}
Philip Reames2b969d72015-03-24 22:28:45 +000065 filter [0 x i8*] zeroinitializer
66 call void @fn()
67 br label %shared_resume
68
69lpad2:
David Majnemer7fddecc2015-06-17 20:52:32 +000070 %exn2 = landingpad {i8*, i32}
Philip Reames2b969d72015-03-24 22:28:45 +000071 cleanup
72 br label %shared_resume
73
74shared_resume:
75 call void @fn()
76 ret void
77}
78
79; Should not trigger when the landing pads are not the exact same
David Majnemer7fddecc2015-06-17 20:52:32 +000080define void @neg2() personality i32 (...)* @__gxx_personality_v0 {
Philip Reames2b969d72015-03-24 22:28:45 +000081; CHECK-LABEL: @neg2
82entry:
83; CHECK-LABEL: entry:
84; CHECK: to label %invoke2 unwind label %lpad1
85 invoke void @fn()
86 to label %invoke2 unwind label %lpad1
87
88invoke2:
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
94invoke.cont:
95 ret void
96
97lpad1:
David Majnemer7fddecc2015-06-17 20:52:32 +000098 %exn = landingpad {i8*, i32}
Philip Reames2b969d72015-03-24 22:28:45 +000099 filter [0 x i8*] zeroinitializer
100 br label %shared_resume
101
102lpad2:
David Majnemer7fddecc2015-06-17 20:52:32 +0000103 %exn2 = landingpad {i8*, i32}
Philip Reames2b969d72015-03-24 22:28:45 +0000104 cleanup
105 br label %shared_resume
106
107shared_resume:
108 call void @fn()
109 ret void
110}