| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes='loop(loop-rotate),instcombine' -enable-knowledge-retention -S < %s | FileCheck %s |
| |
| %0 = type { ptr } |
| |
| define ptr @f1(ptr %i0) { |
| ; CHECK-LABEL: define ptr @f1( |
| ; CHECK-SAME: ptr [[I0:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[I21:%.*]] = icmp eq ptr [[I0]], null |
| ; CHECK-NEXT: br i1 [[I21]], label %[[EXIT:.*]], label %[[LOOP_LATCH_LR_PH:.*]] |
| ; CHECK: [[LOOP_LATCH_LR_PH]]: |
| ; CHECK-NEXT: br label %[[LOOP_LATCH:.*]] |
| ; CHECK: [[LOOP_LATCH]]: |
| ; CHECK-NEXT: [[I3:%.*]] = phi ptr [ [[I0]], %[[LOOP_LATCH_LR_PH]] ], [ [[I5:%.*]], %[[LOOP_LATCH]] ] |
| ; CHECK-NEXT: [[I5]] = load ptr, ptr [[I3]], align 8 |
| ; CHECK-NEXT: [[I2:%.*]] = icmp eq ptr [[I5]], null |
| ; CHECK-NEXT: br i1 [[I2]], label %[[LOOP_EXIT_CRIT_EDGE:.*]], label %[[LOOP_LATCH]] |
| ; CHECK: [[LOOP_EXIT_CRIT_EDGE]]: |
| ; CHECK-NEXT: br label %[[EXIT]] |
| ; CHECK: [[EXIT]]: |
| ; CHECK-NEXT: ret ptr undef |
| ; |
| entry: |
| br label %loop |
| |
| loop: |
| %i = phi ptr [ %i0, %entry ], [ %i5, %loop.latch ] |
| %i2 = icmp eq ptr %i, null |
| br i1 %i2, label %exit, label %loop.latch |
| |
| loop.latch: |
| call void @llvm.assume(i1 true) [ "nonnull"(ptr %i) ] |
| %i5 = load ptr, ptr %i, align 8 |
| br label %loop |
| |
| exit: |
| ret ptr undef |
| } |
| |
| declare void @llvm.assume(i1) |