[llvm] 5e90224 - [InstCombine] SimplifyDemandedUseBits - remove lshr node if we only demand known sign bit
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 7 06:39:50 PDT 2022
Author: Simon Pilgrim
Date: 2022-04-07T14:33:31+01:00
New Revision: 5e90224839607b7a87f5d169e407dd5468d20265
URL: https://github.com/llvm/llvm-project/commit/5e90224839607b7a87f5d169e407dd5468d20265
DIFF: https://github.com/llvm/llvm-project/commit/5e90224839607b7a87f5d169e407dd5468d20265.diff
LOG: [InstCombine] SimplifyDemandedUseBits - remove lshr node if we only demand known sign bit
This is a lshr equivalent to D122340 - if we don't demand any of the additional sign bits introduced by the ashr, the lshr can be treated as an ashr and we can remove the shift entirely if we only demand already known sign bits.
Another step towards PR21929
https://alive2.llvm.org/ce/z/6f3kjq
Differential Revision: https://reviews.llvm.org/D123118
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
llvm/test/Transforms/InstCombine/modulo.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 95a6c1f4c875a..735d035692728 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -616,6 +616,19 @@ Value *InstCombinerImpl::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
if (match(I->getOperand(1), m_APInt(SA))) {
uint64_t ShiftAmt = SA->getLimitedValue(BitWidth-1);
+ // If we are just demanding the shifted sign bit and below, then this can
+ // be treated as an ASHR in disguise.
+ if (DemandedMask.countLeadingZeros() >= ShiftAmt) {
+ // If we only want bits that already match the signbit then we don't
+ // need to shift.
+ unsigned NumHiDemandedBits =
+ BitWidth - DemandedMask.countTrailingZeros();
+ unsigned SignBits =
+ ComputeNumSignBits(I->getOperand(0), Depth + 1, CxtI);
+ if (SignBits >= NumHiDemandedBits)
+ return I->getOperand(0);
+ }
+
// Unsigned shift right.
APInt DemandedMaskIn(DemandedMask.shl(ShiftAmt));
diff --git a/llvm/test/Transforms/InstCombine/modulo.ll b/llvm/test/Transforms/InstCombine/modulo.ll
index 6bbc0660deb72..8a2d8cb307b4c 100644
--- a/llvm/test/Transforms/InstCombine/modulo.ll
+++ b/llvm/test/Transforms/InstCombine/modulo.ll
@@ -4,9 +4,8 @@
define i32 @PR21929(i32 %x) {
; CHECK-LABEL: @PR21929(
; CHECK-NEXT: [[REM_I:%.*]] = srem i32 [[X:%.*]], 2
-; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[REM_I]], 30
-; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 2
-; CHECK-NEXT: [[RET_I:%.*]] = add nsw i32 [[TMP2]], [[REM_I]]
+; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[REM_I]], 2
+; CHECK-NEXT: [[RET_I:%.*]] = add nsw i32 [[TMP1]], [[REM_I]]
; CHECK-NEXT: ret i32 [[RET_I]]
;
%rem.i = srem i32 %x, 2
@@ -19,9 +18,8 @@ define i32 @PR21929(i32 %x) {
define <2 x i32> @PR21929_vec(<2 x i32> %x) {
; CHECK-LABEL: @PR21929_vec(
; CHECK-NEXT: [[REM_I:%.*]] = srem <2 x i32> [[X:%.*]], <i32 2, i32 2>
-; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[REM_I]], <i32 30, i32 30>
-; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 2, i32 2>
-; CHECK-NEXT: [[RET_I:%.*]] = add nsw <2 x i32> [[TMP2]], [[REM_I]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[REM_I]], <i32 2, i32 2>
+; CHECK-NEXT: [[RET_I:%.*]] = add nsw <2 x i32> [[TMP1]], [[REM_I]]
; CHECK-NEXT: ret <2 x i32> [[RET_I]]
;
%rem.i = srem <2 x i32> %x, <i32 2, i32 2>
More information about the llvm-commits
mailing list