| ; 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 | |
| } |