blob: 21428c62f5316233edfe7b220c0a45bb593ae02c [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
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000016define void @test2() {
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:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000025 unreachable
Eli Friedmanc4414c62011-03-15 02:23:35 +000026N:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000027 ret void
Chris Lattner033e1562004-10-18 04:06:41 +000028}
29
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000030define i32 @test3(i32 %v) {
Stephen Linc1c7a132013-07-14 01:42:54 +000031; CHECK-LABEL: @test3(
Eli Friedmanc4414c62011-03-15 02:23:35 +000032; CHECK: entry:
33; CHECK-NEXT: [[CMP:%[A-Za-z0-9]+]] = icmp eq i32 %v, 2
34; CHECK-NEXT: select i1 [[CMP]], i32 2, i32 1
35; CHECK-NEXT: ret
36entry:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000037 switch i32 %v, label %default [
38 i32 1, label %U
39 i32 2, label %T
40 ]
Eli Friedmanc4414c62011-03-15 02:23:35 +000041default:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000042 ret i32 1
Eli Friedmanc4414c62011-03-15 02:23:35 +000043U:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000044 unreachable
Eli Friedmanc4414c62011-03-15 02:23:35 +000045T:
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000046 ret i32 2
Chris Lattner033e1562004-10-18 04:06:41 +000047}
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000048
Eli Friedmanc4414c62011-03-15 02:23:35 +000049; PR9450
Marcello Maggioni5bbe3df2014-10-14 01:58:26 +000050define i32 @test4(i32 %v, i32 %w) {
Eli Friedmanc4414c62011-03-15 02:23:35 +000051; CHECK: entry:
52; CHECK-NEXT: switch i32 %v, label %T [
53; CHECK-NEXT: i32 3, label %V
54; CHECK-NEXT: i32 2, label %U
55; CHECK-NEXT: ]
56
57entry:
58 br label %SWITCH
59V:
60 ret i32 7
61SWITCH:
62 switch i32 %v, label %default [
63 i32 1, label %T
64 i32 2, label %U
65 i32 3, label %V
66 ]
67default:
68 unreachable
69U:
Marcello Maggioni5bbe3df2014-10-14 01:58:26 +000070 ret i32 %w
Eli Friedmanc4414c62011-03-15 02:23:35 +000071T:
72 ret i32 2
73}
Arnold Schwaighoferd7d010e2014-10-10 01:27:02 +000074
75
76;; We can either convert the following control-flow to a select or remove the
77;; unreachable control flow because of the undef store of null. Make sure we do
78;; the latter.
79
80define void @test5(i1 %cond, i8* %ptr) {
81
82; CHECK-LABEL: test5
83; CHECK: entry:
84; CHECK-NOT: select
85; CHECK: store i8 2, i8* %ptr
86; CHECK: ret
87
88entry:
89 br i1 %cond, label %bb1, label %bb3
90
91bb3:
92 br label %bb2
93
94bb1:
95 br label %bb2
96
97bb2:
98 %ptr.2 = phi i8* [ %ptr, %bb3 ], [ null, %bb1 ]
99 store i8 2, i8* %ptr.2, align 8
100 ret void
101}
102
103; CHECK-LABEL: test6
104; CHECK: entry:
105; CHECK-NOT: select
106; CHECK: store i8 2, i8* %ptr
107; CHECK: ret
108
109define void @test6(i1 %cond, i8* %ptr) {
110entry:
111 br i1 %cond, label %bb1, label %bb2
112
113bb1:
114 br label %bb2
115
116bb2:
117 %ptr.2 = phi i8* [ %ptr, %entry ], [ null, %bb1 ]
118 store i8 2, i8* %ptr.2, align 8
119 ret void
120}