xref: /llvm-project/llvm/test/Transforms/SCCP/switch-constantfold-crash.ll (revision 9bf6365237f3a8a401afc0a69d2fb6d1b809ce68)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
2; RUN: opt -passes=ipsccp < %s -S | FileCheck %s
3; RUN: opt -passes='ipsccp,ipsccp' < %s -S | FileCheck %s
4
5define void @barney() {
6; CHECK-LABEL: define {{[^@]+}}@barney() {
7; CHECK-NEXT:  bb:
8; CHECK-NEXT:    br label [[BB9:%.*]]
9; CHECK:       bb6:
10; CHECK-NEXT:    unreachable
11; CHECK:       bb9:
12; CHECK-NEXT:    br label [[BB6:%.*]]
13;
14bb:
15  br label %bb9
16
17bb6:                                              ; preds = %bb9
18  unreachable
19
20bb7:                                              ; preds = %bb9
21  unreachable
22
23bb9:                                              ; preds = %bb
24  switch i16 0, label %bb6 [
25  i16 61, label %bb7
26  ]
27}
28
29define void @blam() {
30; CHECK-LABEL: define {{[^@]+}}@blam() {
31; CHECK-NEXT:  bb:
32; CHECK-NEXT:    br label [[BB16:%.*]]
33; CHECK:       bb16:
34; CHECK-NEXT:    br label [[BB38:%.*]]
35; CHECK:       bb38:
36; CHECK-NEXT:    unreachable
37;
38bb:
39  br label %bb16
40
41bb16:                                             ; preds = %bb
42  switch i32 0, label %bb38 [
43  i32 66, label %bb17
44  i32 63, label %bb18
45  i32 86, label %bb19
46  ]
47
48bb17:                                             ; preds = %bb16
49  unreachable
50
51bb18:                                             ; preds = %bb16
52  unreachable
53
54bb19:                                             ; preds = %bb16
55  unreachable
56
57bb38:                                             ; preds = %bb16
58  unreachable
59}
60
61
62define void @hoge(i1 %arg, i16 %arg2) {
63; CHECK-LABEL: define {{[^@]+}}@hoge
64; CHECK-SAME: (i1 [[ARG:%.*]], i16 [[ARG2:%.*]]) {
65; CHECK-NEXT:  bb:
66; CHECK-NEXT:    switch i16 [[ARG2]], label [[BB1:%.*]] [
67; CHECK-NEXT:      i16 135, label [[BB2:%.*]]
68; CHECK-NEXT:      i16 66, label [[BB2]]
69; CHECK-NEXT:    ]
70; CHECK:       bb1:
71; CHECK-NEXT:    ret void
72; CHECK:       bb2:
73; CHECK-NEXT:    br label [[BB3:%.*]]
74; CHECK:       bb3:
75; CHECK-NEXT:    unreachable
76;
77bb:
78  switch i16 %arg2, label %bb1 [
79  i16 135, label %bb2
80  i16 66, label %bb2
81  ]
82
83bb1:                                              ; preds = %bb
84  ret void
85
86bb2:                                              ; preds = %bb, %bb
87  switch i16 0, label %bb3 [
88  i16 61, label %bb4
89  i16 54, label %bb4
90  i16 49, label %bb4
91  ]
92
93bb3:                                              ; preds = %bb2
94  unreachable
95
96bb4:                                              ; preds = %bb2, %bb2, %bb2
97  unreachable
98}
99
100; Test case from PR49573. %default.bb is unfeasible. Make sure it gets replaced
101; by an unreachable block.
102define void @pr49573_main(i1 %arg) {
103entry:
104  %tgt = call i16 @pr49573_fn(i1 %arg)
105  switch i16 %tgt, label %default.bb [
106  i16 0, label %case.0
107  i16 1, label %case.1
108  i16 2, label %case.2
109  ]
110
111case.0:
112  unreachable
113
114default.bb:
115  ret void
116
117case.1:
118  ret void
119
120case.2:
121  br label %next
122
123next:
124  %tgt.2 = call i16 @pr49573_fn_2(i1 %arg)
125  switch i16 %tgt.2, label %default.bb [
126  i16 0, label %case.0
127  i16 2, label %case.2
128  ]
129}
130
131; Make sure a new unreachable BB is created.
132define void @pr49573_main_2(i1 %arg) {
133entry:
134  %tgt = call i16 @pr49573_fn(i1 %arg)
135  switch i16 %tgt, label %default.bb [
136  i16 0, label %case.0
137  i16 1, label %case.1
138  i16 2, label %case.2
139  ]
140
141case.0:
142  unreachable
143
144default.bb:
145  ret void
146
147case.1:
148  ret void
149
150case.2:
151  ret void
152}
153
154define internal i16 @pr49573_fn(i1 %arg) {
155; CHECK-LABEL: define {{[^@]+}}@pr49573_fn
156; CHECK-SAME: (i1 [[ARG:%.*]]) {
157; CHECK-NEXT:  entry:
158; CHECK-NEXT:    br i1 [[ARG]], label [[THEN:%.*]], label [[ELSE:%.*]]
159; CHECK:       then:
160; CHECK-NEXT:    ret i16 0
161; CHECK:       else:
162; CHECK-NEXT:    ret i16 2
163;
164entry:
165  br i1 %arg, label %then, label %else
166
167then:
168  ret i16 0
169
170else:
171  ret i16 2
172}
173
174define internal i16 @pr49573_fn_2(i1 %arg) {
175; CHECK-LABEL: define {{[^@]+}}@pr49573_fn_2
176; CHECK-SAME: (i1 [[ARG:%.*]]) {
177; CHECK-NEXT:  entry:
178; CHECK-NEXT:    br i1 [[ARG]], label [[THEN:%.*]], label [[ELSE:%.*]]
179; CHECK:       then:
180; CHECK-NEXT:    ret i16 0
181; CHECK:       else:
182; CHECK-NEXT:    ret i16 2
183;
184entry:
185  br i1 %arg, label %then, label %else
186
187then:
188  ret i16 0
189
190else:
191  ret i16 2
192}
193