From 0737770c3e1d5e119148351610c39fb2483c7011 Mon Sep 17 00:00:00 2001 From: Dmitry Makogon Date: Fri, 10 Feb 2023 16:30:47 +0700 Subject: [PATCH] [LVI][CVP] Add test for miscompilation by CVP due to incorrect range returned by LVI This adds a test case from PR60629 which shows a miscompilation by CVP. --- llvm/test/Analysis/LazyValueAnalysis/pr60629.ll | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 llvm/test/Analysis/LazyValueAnalysis/pr60629.ll diff --git a/llvm/test/Analysis/LazyValueAnalysis/pr60629.ll b/llvm/test/Analysis/LazyValueAnalysis/pr60629.ll new file mode 100644 index 0000000..feae45b --- /dev/null +++ b/llvm/test/Analysis/LazyValueAnalysis/pr60629.ll @@ -0,0 +1,48 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -passes=correlated-propagation -S %s | FileCheck %s + +; XFAIL: * + +; 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 +} -- 2.7.4