Use the correct ShiftAmtTy for creating shifts after legalization. PR11881. Not...
authorEli Friedman <eli.friedman@gmail.com>
Tue, 31 Jan 2012 01:08:03 +0000 (01:08 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 31 Jan 2012 01:08:03 +0000 (01:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149315 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/TargetLowering.cpp

index c9d9617cc35c2291da4e5aea99edcba265aa0f8b..792de7562177242628c06968b0d6c5dfd5d58d2d 100644 (file)
@@ -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));
     }