summaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/TargetLowering.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-01-31 01:08:03 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-01-31 01:08:03 +0000
commitd49db36badcfa29022b99325135c3ca429150be0 (patch)
treeb29c722c5e008cc159688be912f8d0fb64be0763 /lib/CodeGen/SelectionDAG/TargetLowering.cpp
parent675f63886944d72e05e5210c36838c797364a0aa (diff)
downloadllvm-d49db36badcfa29022b99325135c3ca429150be0.tar.gz
llvm-d49db36badcfa29022b99325135c3ca429150be0.tar.bz2
llvm-d49db36badcfa29022b99325135c3ca429150be0.tar.xz
Use the correct ShiftAmtTy for creating shifts after legalization. PR11881. Not committing a testcase because I think it will be too fragile.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149315 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/TargetLowering.cpp')
-rw-r--r--lib/CodeGen/SelectionDAG/TargetLowering.cpp16
1 files changed, 9 insertions, 7 deletions
diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index c9d9617cc3..792de75621 100644
--- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -1612,15 +1612,17 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
APInt MsbMask = APInt::getHighBitsSet(BitWidth, 1);
// If we only care about the highest bit, don't bother shifting right.
- if (MsbMask == DemandedMask) {
+ if (MsbMask == DemandedMask) {
unsigned ShAmt = ExVT.getScalarType().getSizeInBits();
SDValue InOp = Op.getOperand(0);
- // In this code we may handle vector types. We can't use the
- // getShiftAmountTy API because it only works on scalars.
- // We use the shift value type because we know that its an integer
- // with enough bits.
- SDValue ShiftAmt = TLO.DAG.getConstant(BitWidth - ShAmt,
- Op.getValueType());
+
+ // Compute the correct shift amount type, which must be getShiftAmountTy
+ // for scalar types after legalization.
+ EVT ShiftAmtTy = Op.getValueType();
+ if (TLO.LegalTypes() && !ShiftAmtTy.isVector())
+ ShiftAmtTy = getShiftAmountTy(ShiftAmtTy);
+
+ SDValue ShiftAmt = TLO.DAG.getConstant(BitWidth - ShAmt, ShiftAmtTy);
return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SHL, dl,
Op.getValueType(), InOp, ShiftAmt));
}