[llvm] 5b25a0b - [CVP] Simplify SRem when constantrange abs(lhs) < abs(rhs)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 3 06:53:12 PST 2023


Author: luxufan
Date: 2023-01-03T22:51:12+08:00
New Revision: 5b25a0bcb14ba0b772a1d6b4ebbed5869a4a0fa7

URL: https://github.com/llvm/llvm-project/commit/5b25a0bcb14ba0b772a1d6b4ebbed5869a4a0fa7
DIFF: https://github.com/llvm/llvm-project/commit/5b25a0bcb14ba0b772a1d6b4ebbed5869a4a0fa7.diff

LOG: [CVP] Simplify SRem when constantrange abs(lhs) < abs(rhs)

For `srem x, y`, if abs(constant range of x) less than abs(constant
range of y), we can simplify it as:
`srem x, y => x` if y is guaranteed to be positive.
'srem x, y => -x' if y is guaranteed to be negative.

Differential Revision: https://reviews.llvm.org/D140405

Added: 
    

Modified: 
    llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
    llvm/test/Transforms/CorrelatedValuePropagation/srem.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
index fdebd6fff03c4..c50ba30377bde 100644
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -905,6 +905,15 @@ static bool processSRem(BinaryOperator *SDI, LazyValueInfo *LVI) {
   if (SDI->getType()->isVectorTy())
     return false;
 
+  ConstantRange LCR = LVI->getConstantRange(SDI->getOperand(0), SDI);
+  ConstantRange RCR = LVI->getConstantRange(SDI->getOperand(1), SDI);
+
+  if (LCR.abs().icmp(CmpInst::ICMP_ULT, RCR.abs())) {
+    SDI->replaceAllUsesWith(SDI->getOperand(0));
+    SDI->eraseFromParent();
+    return true;
+  }
+
   struct Operand {
     Value *V;
     Domain D;

diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll b/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll
index 5c2175603c743..5f6facd85f9d1 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll
@@ -523,8 +523,7 @@ define dso_local i8 @abs_x_lt_abs_y_positive(i8 %x, i8 %y) {
 ; CHECK-NEXT:    [[AND_COND:%.*]] = and i1 [[AND_X]], [[Y_CMP]]
 ; CHECK-NEXT:    br i1 [[AND_COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
 ; CHECK:       if.else:
-; CHECK-NEXT:    [[REM:%.*]] = srem i8 [[X]], [[Y]]
-; CHECK-NEXT:    ret i8 [[REM]]
+; CHECK-NEXT:    ret i8 [[X]]
 ; CHECK:       if.then:
 ; CHECK-NEXT:    ret i8 0
 ;
@@ -556,8 +555,7 @@ define dso_local i8 @abs_x_lt_abs_y_positive_unsigned_cmp(i8 %x, i8 %y) {
 ; CHECK-NEXT:    [[AND_COND:%.*]] = and i1 [[AND_X]], [[AND_Y]]
 ; CHECK-NEXT:    br i1 [[AND_COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
 ; CHECK:       if.else:
-; CHECK-NEXT:    [[REM:%.*]] = srem i8 [[X]], [[Y]]
-; CHECK-NEXT:    ret i8 [[REM]]
+; CHECK-NEXT:    ret i8 [[X]]
 ; CHECK:       if.then:
 ; CHECK-NEXT:    ret i8 0
 ;
@@ -591,8 +589,7 @@ define dso_local i8 @abs_x_lt_abs_y_negative(i8 %x, i8 %y) {
 ; CHECK-NEXT:    [[AND_COND:%.*]] = and i1 [[AND_X]], [[AND_Y]]
 ; CHECK-NEXT:    br i1 [[AND_COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
 ; CHECK:       if.else:
-; CHECK-NEXT:    [[REM:%.*]] = srem i8 [[X]], [[Y]]
-; CHECK-NEXT:    ret i8 [[REM]]
+; CHECK-NEXT:    ret i8 [[X]]
 ; CHECK:       if.then:
 ; CHECK-NEXT:    ret i8 0
 ;


        


More information about the llvm-commits mailing list