[llvm] c1efdbc - [ValueTracking] Add computeKnownBits DemandedElts support to shift instructions (PR36319)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 20 04:08:20 PDT 2020
Author: Simon Pilgrim
Date: 2020-03-20T11:08:08Z
New Revision: c1efdbcbe0dfef846a9774eea280a74b9ea19437
URL: https://github.com/llvm/llvm-project/commit/c1efdbcbe0dfef846a9774eea280a74b9ea19437
DIFF: https://github.com/llvm/llvm-project/commit/c1efdbcbe0dfef846a9774eea280a74b9ea19437.diff
LOG: [ValueTracking] Add computeKnownBits DemandedElts support to shift instructions (PR36319)
Added:
Modified:
llvm/lib/Analysis/ValueTracking.cpp
llvm/test/Transforms/InstSimplify/shift-knownbits.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 7a7be5bd3cb3..ea6391d09ca9 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -1003,16 +1003,17 @@ static void computeKnownBitsFromAssume(const Value *V, KnownBits &Known,
/// amount. The results from calling KZF and KOF are conservatively combined for
/// all permitted shift amounts.
static void computeKnownBitsFromShiftOperator(
- const Operator *I, KnownBits &Known, KnownBits &Known2,
- unsigned Depth, const Query &Q,
+ const Operator *I, const APInt &DemandedElts, KnownBits &Known,
+ KnownBits &Known2, unsigned Depth, const Query &Q,
function_ref<APInt(const APInt &, unsigned)> KZF,
function_ref<APInt(const APInt &, unsigned)> KOF) {
unsigned BitWidth = Known.getBitWidth();
- if (auto *SA = dyn_cast<ConstantInt>(I->getOperand(1))) {
- unsigned ShiftAmt = SA->getLimitedValue(BitWidth-1);
+ computeKnownBits(I->getOperand(1), DemandedElts, Known, Depth + 1, Q);
+ if (Known.isConstant()) {
+ unsigned ShiftAmt = Known.getConstant().getLimitedValue(BitWidth - 1);
- computeKnownBits(I->getOperand(0), Known, Depth + 1, Q);
+ computeKnownBits(I->getOperand(0), DemandedElts, Known, Depth + 1, Q);
Known.Zero = KZF(Known.Zero, ShiftAmt);
Known.One = KOF(Known.One, ShiftAmt);
// If the known bits conflict, this must be an overflowing left shift, so
@@ -1024,11 +1025,10 @@ static void computeKnownBitsFromShiftOperator(
return;
}
- computeKnownBits(I->getOperand(1), Known, Depth + 1, Q);
-
// If the shift amount could be greater than or equal to the bit-width of the
// LHS, the value could be poison, but bail out because the check below is
- // expensive. TODO: Should we just carry on?
+ // expensive.
+ // TODO: Should we just carry on?
if (Known.getMaxValue().uge(BitWidth)) {
Known.resetAll();
return;
@@ -1057,7 +1057,7 @@ static void computeKnownBitsFromShiftOperator(
return;
}
- computeKnownBits(I->getOperand(0), Known2, Depth + 1, Q);
+ computeKnownBits(I->getOperand(0), DemandedElts, Known2, Depth + 1, Q);
Known.Zero.setAllBits();
Known.One.setAllBits();
@@ -1302,7 +1302,8 @@ static void computeKnownBitsFromOperator(const Operator *I,
return KOResult;
};
- computeKnownBitsFromShiftOperator(I, Known, Known2, Depth, Q, KZF, KOF);
+ computeKnownBitsFromShiftOperator(I, DemandedElts, Known, Known2, Depth, Q,
+ KZF, KOF);
break;
}
case Instruction::LShr: {
@@ -1318,7 +1319,8 @@ static void computeKnownBitsFromOperator(const Operator *I,
return KnownOne.lshr(ShiftAmt);
};
- computeKnownBitsFromShiftOperator(I, Known, Known2, Depth, Q, KZF, KOF);
+ computeKnownBitsFromShiftOperator(I, DemandedElts, Known, Known2, Depth, Q,
+ KZF, KOF);
break;
}
case Instruction::AShr: {
@@ -1331,7 +1333,8 @@ static void computeKnownBitsFromOperator(const Operator *I,
return KnownOne.ashr(ShiftAmt);
};
- computeKnownBitsFromShiftOperator(I, Known, Known2, Depth, Q, KZF, KOF);
+ computeKnownBitsFromShiftOperator(I, DemandedElts, Known, Known2, Depth, Q,
+ KZF, KOF);
break;
}
case Instruction::Sub: {
diff --git a/llvm/test/Transforms/InstSimplify/shift-knownbits.ll b/llvm/test/Transforms/InstSimplify/shift-knownbits.ll
index f4b10a348f84..66e987182190 100644
--- a/llvm/test/Transforms/InstSimplify/shift-knownbits.ll
+++ b/llvm/test/Transforms/InstSimplify/shift-knownbits.ll
@@ -181,10 +181,7 @@ define <2 x i8> @lshr_ctlz_zero_is_undef_splat_vec(<2 x i8> %x) {
define i8 @lshr_ctlz_zero_is_undef_vec(<2 x i8> %x) {
; CHECK-LABEL: @lshr_ctlz_zero_is_undef_vec(
-; CHECK-NEXT: [[CT:%.*]] = call <2 x i8> @llvm.ctlz.v2i8(<2 x i8> [[X:%.*]], i1 true)
-; CHECK-NEXT: [[SH:%.*]] = lshr <2 x i8> [[CT]], <i8 3, i8 0>
-; CHECK-NEXT: [[EX:%.*]] = extractelement <2 x i8> [[SH]], i32 0
-; CHECK-NEXT: ret i8 [[EX]]
+; CHECK-NEXT: ret i8 0
;
%ct = call <2 x i8> @llvm.ctlz.v2i8(<2 x i8> %x, i1 true)
%sh = lshr <2 x i8> %ct, <i8 3, i8 0>
@@ -203,10 +200,7 @@ define <2 x i8> @lshr_cttz_zero_is_undef_splat_vec(<2 x i8> %x) {
define i8 @lshr_cttz_zero_is_undef_vec(<2 x i8> %x) {
; CHECK-LABEL: @lshr_cttz_zero_is_undef_vec(
-; CHECK-NEXT: [[CT:%.*]] = call <2 x i8> @llvm.cttz.v2i8(<2 x i8> [[X:%.*]], i1 true)
-; CHECK-NEXT: [[SH:%.*]] = lshr <2 x i8> [[CT]], <i8 3, i8 0>
-; CHECK-NEXT: [[EX:%.*]] = extractelement <2 x i8> [[SH]], i32 0
-; CHECK-NEXT: ret i8 [[EX]]
+; CHECK-NEXT: ret i8 0
;
%ct = call <2 x i8> @llvm.cttz.v2i8(<2 x i8> %x, i1 true)
%sh = lshr <2 x i8> %ct, <i8 3, i8 0>
More information about the llvm-commits
mailing list