; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -passes=correlated-propagation -S %s | FileCheck %s ; Check that shift is not removed by CVP because of incorrect range returned by LVI::getConstantRangeAtUse. ; https://github.com/llvm/llvm-project/issues/60629 define i32 @test(i32 %arg) { ; CHECK-LABEL: @test( ; CHECK-NEXT: entry: ; CHECK-NEXT: br label [[LOOP:%.*]] ; CHECK: loop: ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 127, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[DO_SHIFT:%.*]] ] ; CHECK-NEXT: [[SHIFTED_IV:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[SHIFT:%.*]], [[DO_SHIFT]] ] ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp sgt i32 [[IV]], 127 ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[EXIT:%.*]], label [[DO_SHIFT]] ; CHECK: do.shift: ; CHECK-NEXT: [[SHIFT]] = ashr i32 [[IV]], [[ARG:%.*]] ; CHECK-NEXT: br label [[LOOP]] ; CHECK: bb1: ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ 0, [[BB1:%.*]] ], [ [[SHIFTED_IV]], [[LOOP]] ] ; CHECK-NEXT: ret i32 [[RETVAL]] ; entry: br label %loop loop: ; preds = %do.shift, %entry %iv = phi i32 [ 127, %entry ], [ %iv.next, %do.shift ] %shifted.iv = phi i32 [ 0, %entry ], [ %shift, %do.shift ] %iv.next = add i32 %iv, 1 %loop_cond = icmp sgt i32 %iv, 127 br i1 %loop_cond, label %exit, label %do.shift do.shift: ; preds = %loop %shift = ashr i32 %iv, %arg br label %loop bb1: ; No predecessors! br label %exit exit: ; preds = %loop, %bb1 %retval = phi i32 [ 0, %bb1 ], [ %shifted.iv, %loop ] ret i32 %retval }