|
4 | 4 | ; Make sure we always consider the default edge executable for a switch
|
5 | 5 | ; with no cases.
|
6 | 6 | declare void @foo()
|
| 7 | +declare i32 @g(i32) |
| 8 | + |
7 | 9 | define void @test1() {
|
8 | 10 | ; CHECK-LABEL: @test1(
|
9 | 11 | ; CHECK-NEXT: switch i32 undef, label [[D:%.*]] [
|
@@ -115,17 +117,16 @@ switch.1:
|
115 | 117 | ret i32 %phi
|
116 | 118 | }
|
117 | 119 |
|
118 |
| -; TODO: Determine that the default destination is dead. |
119 | 120 | define i32 @test_local_range(ptr %p) {
|
120 | 121 | ; CHECK-LABEL: @test_local_range(
|
121 | 122 | ; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0]]
|
122 |
| -; CHECK-NEXT: switch i32 [[X]], label [[SWITCH_DEFAULT:%.*]] [ |
| 123 | +; CHECK-NEXT: switch i32 [[X]], label [[DEFAULT_UNREACHABLE:%.*]] [ |
123 | 124 | ; CHECK-NEXT: i32 0, label [[SWITCH_0:%.*]]
|
124 | 125 | ; CHECK-NEXT: i32 1, label [[SWITCH_1:%.*]]
|
125 | 126 | ; CHECK-NEXT: i32 2, label [[SWITCH_2:%.*]]
|
126 | 127 | ; CHECK-NEXT: ]
|
127 |
| -; CHECK: switch.default: |
128 |
| -; CHECK-NEXT: ret i32 -1 |
| 128 | +; CHECK: default.unreachable: |
| 129 | +; CHECK-NEXT: unreachable |
129 | 130 | ; CHECK: switch.0:
|
130 | 131 | ; CHECK-NEXT: ret i32 0
|
131 | 132 | ; CHECK: switch.1:
|
@@ -161,14 +162,14 @@ switch.3:
|
161 | 162 | define i32 @test_duplicate_successors(ptr %p) {
|
162 | 163 | ; CHECK-LABEL: @test_duplicate_successors(
|
163 | 164 | ; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0]]
|
164 |
| -; CHECK-NEXT: switch i32 [[X]], label [[SWITCH_DEFAULT:%.*]] [ |
| 165 | +; CHECK-NEXT: switch i32 [[X]], label [[DEFAULT_UNREACHABLE:%.*]] [ |
165 | 166 | ; CHECK-NEXT: i32 0, label [[SWITCH_0:%.*]]
|
166 | 167 | ; CHECK-NEXT: i32 1, label [[SWITCH_0]]
|
167 | 168 | ; CHECK-NEXT: i32 2, label [[SWITCH_1:%.*]]
|
168 | 169 | ; CHECK-NEXT: i32 3, label [[SWITCH_1]]
|
169 | 170 | ; CHECK-NEXT: ]
|
170 |
| -; CHECK: switch.default: |
171 |
| -; CHECK-NEXT: ret i32 -1 |
| 171 | +; CHECK: default.unreachable: |
| 172 | +; CHECK-NEXT: unreachable |
172 | 173 | ; CHECK: switch.0:
|
173 | 174 | ; CHECK-NEXT: ret i32 0
|
174 | 175 | ; CHECK: switch.1:
|
@@ -201,13 +202,13 @@ switch.2:
|
201 | 202 | ; range information.
|
202 | 203 | define internal i32 @test_ip_range(i32 %x) {
|
203 | 204 | ; CHECK-LABEL: @test_ip_range(
|
204 |
| -; CHECK-NEXT: switch i32 [[X:%.*]], label [[SWITCH_DEFAULT:%.*]] [ |
| 205 | +; CHECK-NEXT: switch i32 [[X:%.*]], label [[DEFAULT_UNREACHABLE:%.*]] [ |
205 | 206 | ; CHECK-NEXT: i32 3, label [[SWITCH_3:%.*]]
|
206 | 207 | ; CHECK-NEXT: i32 1, label [[SWITCH_1:%.*]]
|
207 | 208 | ; CHECK-NEXT: i32 2, label [[SWITCH_2:%.*]]
|
208 | 209 | ; CHECK-NEXT: ], !prof [[PROF1:![0-9]+]]
|
209 |
| -; CHECK: switch.default: |
210 |
| -; CHECK-NEXT: ret i32 -1 |
| 210 | +; CHECK: default.unreachable: |
| 211 | +; CHECK-NEXT: unreachable |
211 | 212 | ; CHECK: switch.1:
|
212 | 213 | ; CHECK-NEXT: ret i32 1
|
213 | 214 | ; CHECK: switch.2:
|
@@ -240,8 +241,8 @@ switch.3:
|
240 | 241 |
|
241 | 242 | define void @call_test_ip_range() {
|
242 | 243 | ; CHECK-LABEL: @call_test_ip_range(
|
243 |
| -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @test_ip_range(i32 1) |
244 |
| -; CHECK-NEXT: [[TMP2:%.*]] = call i32 @test_ip_range(i32 3) |
| 244 | +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @test_ip_range(i32 1), !range [[RNG2:![0-9]+]] |
| 245 | +; CHECK-NEXT: [[TMP2:%.*]] = call i32 @test_ip_range(i32 3), !range [[RNG2]] |
245 | 246 | ; CHECK-NEXT: ret void
|
246 | 247 | ;
|
247 | 248 | call i32 @test_ip_range(i32 1)
|
@@ -301,6 +302,72 @@ end.2:
|
301 | 302 | ret i32 20
|
302 | 303 | }
|
303 | 304 |
|
| 305 | +define i32 @test_default_unreachable_by_dom_cond(i32 %x) { |
| 306 | +; CHECK-LABEL: @test_default_unreachable_by_dom_cond( |
| 307 | +; CHECK-NEXT: entry: |
| 308 | +; CHECK-NEXT: [[OR_COND:%.*]] = icmp ult i32 [[X:%.*]], 4 |
| 309 | +; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[RETURN:%.*]] |
| 310 | +; CHECK: if.then: |
| 311 | +; CHECK-NEXT: switch i32 [[X]], label [[DEFAULT_UNREACHABLE:%.*]] [ |
| 312 | +; CHECK-NEXT: i32 0, label [[SW_BB:%.*]] |
| 313 | +; CHECK-NEXT: i32 1, label [[SW_BB2:%.*]] |
| 314 | +; CHECK-NEXT: i32 2, label [[SW_BB4:%.*]] |
| 315 | +; CHECK-NEXT: i32 3, label [[SW_BB6:%.*]] |
| 316 | +; CHECK-NEXT: ] |
| 317 | +; CHECK: sw.bb: |
| 318 | +; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @g(i32 2) |
| 319 | +; CHECK-NEXT: br label [[RETURN]] |
| 320 | +; CHECK: sw.bb2: |
| 321 | +; CHECK-NEXT: [[CALL3:%.*]] = tail call i32 @g(i32 3) |
| 322 | +; CHECK-NEXT: br label [[RETURN]] |
| 323 | +; CHECK: sw.bb4: |
| 324 | +; CHECK-NEXT: [[CALL5:%.*]] = tail call i32 @g(i32 4) |
| 325 | +; CHECK-NEXT: br label [[RETURN]] |
| 326 | +; CHECK: sw.bb6: |
| 327 | +; CHECK-NEXT: [[CALL7:%.*]] = tail call i32 @g(i32 5) |
| 328 | +; CHECK-NEXT: br label [[RETURN]] |
| 329 | +; CHECK: default.unreachable: |
| 330 | +; CHECK-NEXT: unreachable |
| 331 | +; CHECK: return: |
| 332 | +; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL7]], [[SW_BB6]] ], [ [[CALL5]], [[SW_BB4]] ], [ [[CALL3]], [[SW_BB2]] ], [ [[CALL]], [[SW_BB]] ], [ -23, [[ENTRY:%.*]] ] |
| 333 | +; CHECK-NEXT: ret i32 [[RETVAL_0]] |
| 334 | +; |
| 335 | +entry: |
| 336 | + %or.cond = icmp ult i32 %x, 4 |
| 337 | + br i1 %or.cond, label %if.then, label %return |
| 338 | + |
| 339 | +if.then: |
| 340 | + switch i32 %x, label %sw.epilog [ |
| 341 | + i32 0, label %sw.bb |
| 342 | + i32 1, label %sw.bb2 |
| 343 | + i32 2, label %sw.bb4 |
| 344 | + i32 3, label %sw.bb6 |
| 345 | + ] |
| 346 | + |
| 347 | +sw.bb: |
| 348 | + %call = tail call i32 @g(i32 2) |
| 349 | + br label %return |
| 350 | + |
| 351 | +sw.bb2: |
| 352 | + %call3 = tail call i32 @g(i32 3) |
| 353 | + br label %return |
| 354 | + |
| 355 | +sw.bb4: |
| 356 | + %call5 = tail call i32 @g(i32 4) |
| 357 | + br label %return |
| 358 | + |
| 359 | +sw.bb6: |
| 360 | + %call7 = tail call i32 @g(i32 5) |
| 361 | + br label %return |
| 362 | + |
| 363 | +sw.epilog: |
| 364 | + call void @foo() |
| 365 | + br label %return |
| 366 | + |
| 367 | +return: |
| 368 | + %retval.0 = phi i32 [ %call7, %sw.bb6 ], [ %call5, %sw.bb4 ], [ %call3, %sw.bb2 ], [ %call, %sw.bb ], [ -23, %sw.epilog ], [ -23, %entry ] |
| 369 | + ret i32 %retval.0 |
| 370 | +} |
304 | 371 |
|
305 | 372 | declare void @llvm.assume(i1)
|
306 | 373 |
|
|
0 commit comments