|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
|
2 |
| -; RUN: opt -S -passes=licm < %s | FileCheck %s |
| 2 | +; RUN: opt -S -passes=licm < %s | FileCheck %s --check-prefixes=CHECK,SPEC |
| 3 | +; RUN: opt -S -passes='licm<no-allowspeculation>' < %s | FileCheck %s --check-prefixes=CHECK,NOSPEC |
3 | 4 |
|
4 | 5 | declare void @use(ptr)
|
5 | 6 | declare i32 @get.i32()
|
@@ -387,3 +388,55 @@ loop:
|
387 | 388 | exit:
|
388 | 389 | ret void
|
389 | 390 | }
|
| 391 | + |
| 392 | +define void @src_already_invariant_speculation(ptr %ptr, i1 %c, i1 %c2, i64 %arg1, i64 %arg2) { |
| 393 | +; SPEC-LABEL: define void @src_already_invariant_speculation |
| 394 | +; SPEC-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]], i1 [[C2:%.*]], i64 [[ARG1:%.*]], i64 [[ARG2:%.*]]) { |
| 395 | +; SPEC-NEXT: entry: |
| 396 | +; SPEC-NEXT: [[PTR2:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[ARG1]] |
| 397 | +; SPEC-NEXT: [[PTR3:%.*]] = getelementptr i8, ptr [[PTR2]], i64 [[ARG2]] |
| 398 | +; SPEC-NEXT: br label [[LOOP:%.*]] |
| 399 | +; SPEC: loop: |
| 400 | +; SPEC-NEXT: br i1 [[C2]], label [[IF:%.*]], label [[LATCH:%.*]] |
| 401 | +; SPEC: if: |
| 402 | +; SPEC-NEXT: call void @use(ptr [[PTR3]]) |
| 403 | +; SPEC-NEXT: br label [[LATCH]] |
| 404 | +; SPEC: latch: |
| 405 | +; SPEC-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]] |
| 406 | +; SPEC: exit: |
| 407 | +; SPEC-NEXT: ret void |
| 408 | +; |
| 409 | +; NOSPEC-LABEL: define void @src_already_invariant_speculation |
| 410 | +; NOSPEC-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]], i1 [[C2:%.*]], i64 [[ARG1:%.*]], i64 [[ARG2:%.*]]) { |
| 411 | +; NOSPEC-NEXT: entry: |
| 412 | +; NOSPEC-NEXT: br label [[LOOP:%.*]] |
| 413 | +; NOSPEC: loop: |
| 414 | +; NOSPEC-NEXT: br i1 [[C2]], label [[IF:%.*]], label [[LATCH:%.*]] |
| 415 | +; NOSPEC: if: |
| 416 | +; NOSPEC-NEXT: [[PTR2:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[ARG1]] |
| 417 | +; NOSPEC-NEXT: [[PTR3:%.*]] = getelementptr i8, ptr [[PTR2]], i64 [[ARG2]] |
| 418 | +; NOSPEC-NEXT: call void @use(ptr [[PTR3]]) |
| 419 | +; NOSPEC-NEXT: br label [[LATCH]] |
| 420 | +; NOSPEC: latch: |
| 421 | +; NOSPEC-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]] |
| 422 | +; NOSPEC: exit: |
| 423 | +; NOSPEC-NEXT: ret void |
| 424 | +; |
| 425 | +entry: |
| 426 | + br label %loop |
| 427 | + |
| 428 | +loop: |
| 429 | + br i1 %c2, label %if, label %latch |
| 430 | + |
| 431 | +if: |
| 432 | + %ptr2 = getelementptr i8, ptr %ptr, i64 %arg1 |
| 433 | + %ptr3 = getelementptr i8, ptr %ptr2, i64 %arg2 |
| 434 | + call void @use(ptr %ptr3) |
| 435 | + br label %latch |
| 436 | + |
| 437 | +latch: |
| 438 | + br i1 %c, label %loop, label %exit |
| 439 | + |
| 440 | +exit: |
| 441 | + ret void |
| 442 | +} |
0 commit comments