|
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