xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/switch_ub.ll (revision 07b9d231ff9baa6473b0dd588a3ce5330d3e4871)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
3
4declare void @foo_01()
5declare void @foo_02()
6declare void @foo_03()
7
8define i32 @test_01(ptr %p, i32 %x, i1 %cond) {
9; CHECK-LABEL: @test_01(
10; CHECK-NEXT:  entry:
11; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB:%.*]], label [[COMMON_RET:%.*]]
12; CHECK:       common.ret:
13; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 0, [[ENTRY:%.*]] ]
14; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
15; CHECK:       bb:
16; CHECK-NEXT:    [[R]] = load i32, ptr [[P:%.*]], align 4
17; CHECK-NEXT:    br label [[COMMON_RET]]
18;
19entry:
20  br i1 %cond, label %bb, label %pred
21
22pred:
23  switch i32 %x, label %other_succ [i32 42, label %bb
24  i32 123456, label %bb
25  i32 -654321, label %bb]
26
27bb:
28  %phi = phi ptr [null, %pred], [null, %pred], [null, %pred], [%p, %entry]
29  %r = load i32, ptr %phi
30  ret i32 %r
31
32other_succ:
33  ret i32 0
34}
35
36define i32 @test_02(ptr %p, i32 %x, i1 %cond) {
37; CHECK-LABEL: @test_02(
38; CHECK-NEXT:  entry:
39; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB:%.*]], label [[COMMON_RET:%.*]]
40; CHECK:       common.ret:
41; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 0, [[ENTRY:%.*]] ]
42; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
43; CHECK:       bb:
44; CHECK-NEXT:    [[R]] = load i32, ptr [[P:%.*]], align 4
45; CHECK-NEXT:    br label [[COMMON_RET]]
46;
47entry:
48  br i1 %cond, label %bb, label %pred
49
50pred:
51  switch i32 %x, label %bb [i32 42, label %other_succ
52  i32 123456, label %other_succ
53  i32 -654321, label %other_succ]
54
55bb:
56  %phi = phi ptr [null, %pred], [%p, %entry]
57  %r = load i32, ptr %phi
58  ret i32 %r
59
60other_succ:
61  ret i32 0
62}
63
64define i32 @test_03(ptr %p, i32 %x, i1 %cond) {
65; CHECK-LABEL: @test_03(
66; CHECK-NEXT:  entry:
67; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB:%.*]], label [[PRED:%.*]]
68; CHECK:       pred:
69; CHECK-NEXT:    switch i32 [[X:%.*]], label [[UNREACHABLE:%.*]] [
70; CHECK-NEXT:      i32 42, label [[COMMON_RET:%.*]]
71; CHECK-NEXT:      i32 123456, label [[COMMON_RET]]
72; CHECK-NEXT:      i32 -654321, label [[COMMON_RET]]
73; CHECK-NEXT:      i32 1, label [[DO_1:%.*]]
74; CHECK-NEXT:      i32 2, label [[DO_2:%.*]]
75; CHECK-NEXT:      i32 3, label [[DO_3:%.*]]
76; CHECK-NEXT:    ]
77; CHECK:       common.ret:
78; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 1, [[DO_1]] ], [ 1, [[DO_2]] ], [ 1, [[DO_3]] ], [ 0, [[PRED]] ], [ 0, [[PRED]] ], [ 0, [[PRED]] ]
79; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
80; CHECK:       unreachable:
81; CHECK-NEXT:    unreachable
82; CHECK:       bb:
83; CHECK-NEXT:    [[R]] = load i32, ptr [[P:%.*]], align 4
84; CHECK-NEXT:    br label [[COMMON_RET]]
85; CHECK:       do_1:
86; CHECK-NEXT:    call void @foo_01()
87; CHECK-NEXT:    br label [[COMMON_RET]]
88; CHECK:       do_2:
89; CHECK-NEXT:    call void @foo_02()
90; CHECK-NEXT:    br label [[COMMON_RET]]
91; CHECK:       do_3:
92; CHECK-NEXT:    call void @foo_03()
93; CHECK-NEXT:    br label [[COMMON_RET]]
94;
95entry:
96  br i1 %cond, label %bb, label %pred
97
98pred:
99  switch i32 %x, label %bb [i32 42, label %other_succ
100  i32 123456, label %other_succ
101  i32 -654321, label %other_succ
102  i32 1, label %do_1
103  i32 2, label %do_2
104  i32 3, label %do_3]
105
106bb:
107  %phi = phi ptr [null, %pred], [%p, %entry]
108  %r = load i32, ptr %phi
109  ret i32 %r
110
111do_1:
112  call void @foo_01()
113  ret i32 1
114
115do_2:
116  call void @foo_02()
117  ret i32 1
118
119do_3:
120  call void @foo_03()
121  ret i32 1
122
123other_succ:
124  ret i32 0
125}
126
127define i32 @test_04(ptr %p, i32 %x, i1 %cond) {
128; CHECK-LABEL: @test_04(
129; CHECK-NEXT:  entry:
130; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB:%.*]], label [[PRED:%.*]]
131; CHECK:       pred:
132; CHECK-NEXT:    switch i32 [[X:%.*]], label [[COMMON_RET:%.*]] [
133; CHECK-NEXT:      i32 3, label [[DO_3:%.*]]
134; CHECK-NEXT:      i32 2, label [[DO_2:%.*]]
135; CHECK-NEXT:      i32 1, label [[DO_1:%.*]]
136; CHECK-NEXT:    ]
137; CHECK:       common.ret:
138; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 1, [[DO_1]] ], [ 1, [[DO_2]] ], [ 1, [[DO_3]] ], [ 0, [[PRED]] ]
139; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
140; CHECK:       bb:
141; CHECK-NEXT:    [[R]] = load i32, ptr [[P:%.*]], align 4
142; CHECK-NEXT:    br label [[COMMON_RET]]
143; CHECK:       do_1:
144; CHECK-NEXT:    call void @foo_01()
145; CHECK-NEXT:    br label [[COMMON_RET]]
146; CHECK:       do_2:
147; CHECK-NEXT:    call void @foo_02()
148; CHECK-NEXT:    br label [[COMMON_RET]]
149; CHECK:       do_3:
150; CHECK-NEXT:    call void @foo_03()
151; CHECK-NEXT:    br label [[COMMON_RET]]
152;
153entry:
154  br i1 %cond, label %bb, label %pred
155
156pred:
157  switch i32 %x, label %other_succ [i32 42, label %bb
158  i32 123456, label %bb
159  i32 -654321, label %bb
160  i32 1, label %do_1
161  i32 2, label %do_2
162  i32 3, label %do_3]
163
164bb:
165  %phi = phi ptr [null, %pred], [null, %pred], [null, %pred], [%p, %entry]
166  %r = load i32, ptr %phi
167  ret i32 %r
168
169do_1:
170  call void @foo_01()
171  ret i32 1
172
173do_2:
174  call void @foo_02()
175  ret i32 1
176
177do_3:
178  call void @foo_03()
179  ret i32 1
180
181other_succ:
182  ret i32 0
183}
184