| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes="loop-simplify" -S %s | FileCheck %s |
| |
| ; Make sure Loop::makeLoopInvariant strips the "dereferenceable" attribute. |
| |
| declare i32 @g() |
| define ptr @f(ptr %p, i1 %b) { |
| ; CHECK-LABEL: define ptr @f( |
| ; CHECK-SAME: ptr [[P:%.*]], i1 [[B:%.*]]) { |
| ; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -2) |
| ; CHECK-NEXT: br label %[[LOOP:.*]] |
| ; CHECK: [[LOOP]]: |
| ; CHECK-NEXT: [[I:%.*]] = call i32 @g() |
| ; CHECK-NEXT: br i1 [[B]], label %[[LOOP_CONT:.*]], label %[[EXIT:.*]] |
| ; CHECK: [[LOOP_CONT]]: |
| ; CHECK-NEXT: [[B2:%.*]] = icmp eq i32 [[I]], 0 |
| ; CHECK-NEXT: br i1 [[B2]], label %[[LOOP]], label %[[EXIT]] |
| ; CHECK: [[EXIT]]: |
| ; CHECK-NEXT: [[PP:%.*]] = phi ptr [ [[MASKED]], %[[LOOP_CONT]] ], [ null, %[[LOOP]] ] |
| ; CHECK-NEXT: ret ptr [[PP]] |
| ; |
| br label %loop |
| |
| loop: |
| %i = call i32 @g() |
| br i1 %b, label %loop.cont, label %exit |
| |
| loop.cont: |
| %masked = call ptr @llvm.ptrmask.p0.i64(ptr dereferenceable(12) %p, i64 -2) |
| %b2 = icmp eq i32 %i, 0 |
| br i1 %b2, label %loop, label %exit |
| |
| exit: |
| %pp = phi ptr [%masked, %loop.cont], [null, %loop] |
| ret ptr %pp |
| } |