[llvm] 90b55f2 - [CVP] Don't freeze value if guaranteed non-undef

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 19 06:45:00 PDT 2023


Author: Nikita Popov
Date: 2023-06-19T15:44:51+02:00
New Revision: 90b55f2bba365c1e83c3be60583b449e07f846f3

URL: https://github.com/llvm/llvm-project/commit/90b55f2bba365c1e83c3be60583b449e07f846f3
DIFF: https://github.com/llvm/llvm-project/commit/90b55f2bba365c1e83c3be60583b449e07f846f3.diff

LOG: [CVP] Don't freeze value if guaranteed non-undef

Avoid inserting the freeze if not necessary, as this allows LVI
to continue reasoning about the expression.

Added: 
    

Modified: 
    llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
    llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll
    llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
index 9f503fb43bc35..488297110d6fa 100644
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -766,7 +766,9 @@ static bool expandUDivOrURem(BinaryOperator *Instr, const ConstantRange &XCR,
   if (IsRem) {
     // NOTE: this transformation introduces two uses of X,
     //       but it may be undef so we must freeze it first.
-    Value *FrozenX = B.CreateFreeze(X, X->getName() + ".frozen");
+    Value *FrozenX = X;
+    if (!isGuaranteedNotToBeUndefOrPoison(X))
+      FrozenX = B.CreateFreeze(X, X->getName() + ".frozen");
     auto *AdjX = B.CreateNUWSub(FrozenX, Y, Instr->getName() + ".urem");
     auto *Cmp =
         B.CreateICmp(ICmpInst::ICMP_ULT, FrozenX, Y, Instr->getName() + ".cmp");

diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll b/llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll
index dbb63203cc945..8e5ec878bb894 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll
@@ -346,10 +346,9 @@ define i16 @urem_elide(i16 noundef %x) {
 
 define i16 @urem_expand(i16 noundef %x) {
 ; CHECK-LABEL: @urem_expand(
-; CHECK-NEXT:    [[X_FROZEN:%.*]] = freeze i16 [[X:%.*]]
-; CHECK-NEXT:    [[UREM_UREM:%.*]] = sub nuw i16 [[X_FROZEN]], 42
-; CHECK-NEXT:    [[UREM_CMP:%.*]] = icmp ult i16 [[X_FROZEN]], 42
-; CHECK-NEXT:    [[UREM:%.*]] = select i1 [[UREM_CMP]], i16 [[X_FROZEN]], i16 [[UREM_UREM]]
+; CHECK-NEXT:    [[UREM_UREM:%.*]] = sub nuw i16 [[X:%.*]], 42
+; CHECK-NEXT:    [[UREM_CMP:%.*]] = icmp ult i16 [[X]], 42
+; CHECK-NEXT:    [[UREM:%.*]] = select i1 [[UREM_CMP]], i16 [[X]], i16 [[UREM_UREM]]
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 84
 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[UREM]], i16 24
 ; CHECK-NEXT:    ret i16 [[SEL]]

diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll b/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
index cc4644d83aaf5..2f1ca2483f67d 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/urem-expansion.ll
@@ -331,12 +331,10 @@ define i1 @icmp_after_expansion(i8 noundef %x) {
 ; CHECK-LABEL: @icmp_after_expansion(
 ; CHECK-NEXT:    [[CMP_X_UPPER:%.*]] = icmp ult i8 [[X:%.*]], 6
 ; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_X_UPPER]])
-; CHECK-NEXT:    [[X_FROZEN:%.*]] = freeze i8 [[X]]
-; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X_FROZEN]], 3
-; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X_FROZEN]], 3
-; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X_FROZEN]], i8 [[REM_UREM]]
-; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[REM]], 3
-; CHECK-NEXT:    ret i1 [[CMP]]
+; CHECK-NEXT:    [[REM_UREM:%.*]] = sub nuw i8 [[X]], 3
+; CHECK-NEXT:    [[REM_CMP:%.*]] = icmp ult i8 [[X]], 3
+; CHECK-NEXT:    [[REM:%.*]] = select i1 [[REM_CMP]], i8 [[X]], i8 [[REM_UREM]]
+; CHECK-NEXT:    ret i1 false
 ;
   %cmp.x.upper = icmp ult i8 %x, 6
   call void @llvm.assume(i1 %cmp.x.upper)


        


More information about the llvm-commits mailing list