[MLIR] Extend MPI dialect (#123255)
[llvm-project.git] / llvm / test / Transforms / SCCP / switch-constantfold-crash.ll
blob73eef205adae75770edef0f5961848dcfa899572
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
5 define 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:%.*]]
14 bb:
15   br label %bb9
17 bb6:                                              ; preds = %bb9
18   unreachable
20 bb7:                                              ; preds = %bb9
21   unreachable
23 bb9:                                              ; preds = %bb
24   switch i16 0, label %bb6 [
25   i16 61, label %bb7
26   ]
29 define 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
38 bb:
39   br label %bb16
41 bb16:                                             ; preds = %bb
42   switch i32 0, label %bb38 [
43   i32 66, label %bb17
44   i32 63, label %bb18
45   i32 86, label %bb19
46   ]
48 bb17:                                             ; preds = %bb16
49   unreachable
51 bb18:                                             ; preds = %bb16
52   unreachable
54 bb19:                                             ; preds = %bb16
55   unreachable
57 bb38:                                             ; preds = %bb16
58   unreachable
62 define 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
77 bb:
78   switch i16 %arg2, label %bb1 [
79   i16 135, label %bb2
80   i16 66, label %bb2
81   ]
83 bb1:                                              ; preds = %bb
84   ret void
86 bb2:                                              ; 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   ]
93 bb3:                                              ; preds = %bb2
94   unreachable
96 bb4:                                              ; preds = %bb2, %bb2, %bb2
97   unreachable
100 ; Test case from PR49573. %default.bb is unfeasible. Make sure it gets replaced
101 ; by an unreachable block.
102 define void @pr49573_main(i1 %arg) {
103 entry:
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   ]
111 case.0:
112   unreachable
114 default.bb:
115   ret void
117 case.1:
118   ret void
120 case.2:
121   br label %next
123 next:
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   ]
131 ; Make sure a new unreachable BB is created.
132 define void @pr49573_main_2(i1 %arg) {
133 entry:
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   ]
141 case.0:
142   unreachable
144 default.bb:
145   ret void
147 case.1:
148   ret void
150 case.2:
151   ret void
154 define 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
164 entry:
165   br i1 %arg, label %then, label %else
167 then:
168   ret i16 0
170 else:
171   ret i16 2
174 define 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
184 entry:
185   br i1 %arg, label %then, label %else
187 then:
188   ret i16 0
190 else:
191   ret i16 2