[X86] Use ZERO_EXTEND instead of ANY_EXTEND when extending the shift amount for a...
authorCraig Topper <craig.topper@intel.com>
Tue, 19 Dec 2017 04:52:04 +0000 (04:52 +0000)
committerCraig Topper <craig.topper@intel.com>
Tue, 19 Dec 2017 04:52:04 +0000 (04:52 +0000)
My reading of the SDM says that all bits of the shift amount are used. If the value of the element is larger than the number of bits the result the shift result is zero. So I think we need to zero_extend here to avoid garbage in the upper bits.

In reality we lower any_extend as zero_extend so in most cases it would be hard to hit this.

llvm-svn: 321055

llvm/lib/Target/X86/X86ISelLowering.cpp

index d90c102..32f4b11 100644 (file)
@@ -22989,7 +22989,7 @@ static SDValue LowerShift(SDValue Op, const X86Subtarget &Subtarget,
     unsigned ExtOpc =
         Op.getOpcode() == ISD::SRA ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
     R = DAG.getNode(ExtOpc, dl, ExtVT, R);
-    Amt = DAG.getNode(ISD::ANY_EXTEND, dl, ExtVT, Amt);
+    Amt = DAG.getNode(ISD::ZERO_EXTEND, dl, ExtVT, Amt);
     return DAG.getNode(ISD::TRUNCATE, dl, VT,
                        DAG.getNode(Op.getOpcode(), dl, ExtVT, R, Amt));
   }