]> granicus.if.org Git - llvm/commitdiff
[X86][SSE] Split SimplifyDemandedBitsForTargetNode X86ISD::VSRLI/VSRAI handling.
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 17 Dec 2018 21:36:17 +0000 (21:36 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 17 Dec 2018 21:36:17 +0000 (21:36 +0000)
First step towards adding more capable combines to fix comments in D55768.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349400 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp

index 757fe86935c78016c256f16e670646e11af3d118..925421986772b0aa046bea4e914105a4b9f0c30e 100644 (file)
@@ -32410,8 +32410,22 @@ bool X86TargetLowering::SimplifyDemandedBitsForTargetNode(
     }
     break;
   }
-  case X86ISD::VSRAI:
   case X86ISD::VSRLI: {
+    if (auto *ShiftImm = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
+      if (ShiftImm->getAPIntValue().uge(BitWidth))
+        break;
+
+      KnownBits KnownOp;
+      unsigned ShAmt = ShiftImm->getZExtValue();
+      APInt DemandedMask = OriginalDemandedBits << ShAmt;
+
+      if (SimplifyDemandedBits(Op.getOperand(0), DemandedMask,
+                               OriginalDemandedElts, KnownOp, TLO, Depth + 1))
+        return true;
+    }
+    break;
+  }
+  case X86ISD::VSRAI: {
     if (auto *ShiftImm = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
       if (ShiftImm->getAPIntValue().uge(BitWidth))
         break;
@@ -32422,8 +32436,7 @@ bool X86TargetLowering::SimplifyDemandedBitsForTargetNode(
 
       // If any of the demanded bits are produced by the sign extension, we also
       // demand the input sign bit.
-      if (Opc == X86ISD::VSRAI &&
-          OriginalDemandedBits.countLeadingZeros() < ShAmt)
+      if (OriginalDemandedBits.countLeadingZeros() < ShAmt)
         DemandedMask.setSignBit();
 
       if (SimplifyDemandedBits(Op.getOperand(0), DemandedMask,