blob: be612b288b77ac1a28b689b7ad5460bbc7393ad0 [file] [log] [blame]
Eli Friedmanc4414c62011-03-15 02:23:35 +00001; RUN: opt < %s -simplifycfg -S | FileCheck %s
Chris Lattner033e1562004-10-18 04:06:41 +00002
Tanya Lattnerbaa370b2008-03-18 03:45:45 +00003define void @test1(i1 %C, i1* %BP) {
Stephen Linc1c7a132013-07-14 01:42:54 +00004; CHECK-LABEL: @test1(
Eli Friedmanc4414c62011-03-15 02:23:35 +00005; CHECK: entry:
6; CHECK-NEXT: ret void
7entry:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +00008 br i1 %C, label %T, label %F
Eli Friedmanc4414c62011-03-15 02:23:35 +00009T:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000010 store i1 %C, i1* %BP
11 unreachable
Eli Friedmanc4414c62011-03-15 02:23:35 +000012F:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000013 ret void
Chris Lattner033e1562004-10-18 04:06:41 +000014}
15
David Majnemer7fddecc2015-06-17 20:52:32 +000016define void @test2() personality i32 (...)* @__gxx_personality_v0 {
Stephen Linc1c7a132013-07-14 01:42:54 +000017; CHECK-LABEL: @test2(
Eli Friedmanc4414c62011-03-15 02:23:35 +000018; CHECK: entry:
19; CHECK-NEXT: call void @test2()
20; CHECK-NEXT: ret void
21entry:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000022 invoke void @test2( )
23 to label %N unwind label %U
Eli Friedmanc4414c62011-03-15 02:23:35 +000024U:
David Majnemer7fddecc2015-06-17 20:52:32 +000025 %res = landingpad { i8* }
Duncan P. N. Exon Smith49e6a702015-03-27 22:04:28 +000026 cleanup
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000027 unreachable
Eli Friedmanc4414c62011-03-15 02:23:35 +000028N:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000029 ret void
Chris Lattner033e1562004-10-18 04:06:41 +000030}
31
Duncan P. N. Exon Smith49e6a702015-03-27 22:04:28 +000032declare i32 @__gxx_personality_v0(...)
33
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000034define i32 @test3(i32 %v) {
Stephen Linc1c7a132013-07-14 01:42:54 +000035; CHECK-LABEL: @test3(
Eli Friedmanc4414c62011-03-15 02:23:35 +000036; CHECK: entry:
37; CHECK-NEXT: [[CMP:%[A-Za-z0-9]+]] = icmp eq i32 %v, 2
38; CHECK-NEXT: select i1 [[CMP]], i32 2, i32 1
39; CHECK-NEXT: ret
40entry:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000041 switch i32 %v, label %default [
42 i32 1, label %U
43 i32 2, label %T
44 ]
Eli Friedmanc4414c62011-03-15 02:23:35 +000045default:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000046 ret i32 1
Eli Friedmanc4414c62011-03-15 02:23:35 +000047U:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000048 unreachable
Eli Friedmanc4414c62011-03-15 02:23:35 +000049T:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000050 ret i32 2
Chris Lattner033e1562004-10-18 04:06:41 +000051}
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000052
Arnold Schwaighoferd7d010e2014-10-10 01:27:02 +000053
54;; We can either convert the following control-flow to a select or remove the
55;; unreachable control flow because of the undef store of null. Make sure we do
56;; the latter.
57
58define void @test5(i1 %cond, i8* %ptr) {
59
60; CHECK-LABEL: test5
61; CHECK: entry:
62; CHECK-NOT: select
63; CHECK: store i8 2, i8* %ptr
64; CHECK: ret
65
66entry:
67 br i1 %cond, label %bb1, label %bb3
68
69bb3:
70 br label %bb2
71
72bb1:
73 br label %bb2
74
75bb2:
76 %ptr.2 = phi i8* [ %ptr, %bb3 ], [ null, %bb1 ]
77 store i8 2, i8* %ptr.2, align 8
78 ret void
79}
80
81; CHECK-LABEL: test6
82; CHECK: entry:
83; CHECK-NOT: select
84; CHECK: store i8 2, i8* %ptr
85; CHECK: ret
86
87define void @test6(i1 %cond, i8* %ptr) {
88entry:
89 br i1 %cond, label %bb1, label %bb2
90
91bb1:
92 br label %bb2
93
94bb2:
95 %ptr.2 = phi i8* [ %ptr, %entry ], [ null, %bb1 ]
96 store i8 2, i8* %ptr.2, align 8
97 ret void
98}
David Majnemer1fea77c2016-06-25 07:37:27 +000099
100define i32 @test7(i1 %X) {
101entry:
102 br i1 %X, label %if, label %else
103
104if:
105 call void undef()
106 br label %else
107
108else:
109 %phi = phi i32 [ 0, %entry ], [ 1, %if ]
110 ret i32 %phi
111}
112; CHECK-LABEL: define i32 @test7(
113; CHECK-NOT: call
114; CHECK: ret i32 0
115
116define void @test8(i1 %X, void ()* %Y) {
117entry:
118 br i1 %X, label %if, label %else
119
120if:
121 br label %else
122
123else:
124 %phi = phi void ()* [ %Y, %entry ], [ null, %if ]
125 call void %phi()
126 ret void
127}
128; CHECK-LABEL: define void @test8(
129; CHECK: call void %Y(