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 ;