]> granicus.if.org Git - llvm/commitdiff
[DAGCombine] Simplify ISD::AND handling in ReduceLoadWidth
authorEli Friedman <efriedma@codeaurora.org>
Fri, 1 Dec 2017 19:33:56 +0000 (19:33 +0000)
committerEli Friedman <efriedma@codeaurora.org>
Fri, 1 Dec 2017 19:33:56 +0000 (19:33 +0000)
Followup to D39595. Removes a bunch of redundant checks.

Differential Revision: https://reviews.llvm.org/D40667

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

lib/CodeGen/SelectionDAG/DAGCombiner.cpp

index f04010abb46f91c5bc9d2b42711989a48f7f4dde..2fa5d0a4a3a91418d94a4e4d194495761f2d64d0 100644 (file)
@@ -8019,29 +8019,14 @@ SDValue DAGCombiner::ReduceLoadWidth(SDNode *N) {
       ExtVT = EVT::getIntegerVT(*DAG.getContext(),
                                 VT.getSizeInBits() - ShiftAmt);
   } else if (Opc == ISD::AND) {
-    bool HasAnyExt = N0.getOpcode() == ISD::ANY_EXTEND;
-    LoadSDNode *LN0 =
-      HasAnyExt ? cast<LoadSDNode>(N0.getOperand(0)) : cast<LoadSDNode>(N0);
-
-    if (LN0->getExtensionType() == ISD::SEXTLOAD ||
-        !LN0->isUnindexed() || !N0.hasOneUse() || !SDValue(LN0, 0).hasOneUse())
-      return SDValue();
-
-    auto N1C = dyn_cast<ConstantSDNode>(N->getOperand(1));
-    if (!N1C)
+    // An AND with a constant mask is the same as a truncate + zero-extend.
+    auto AndC = dyn_cast<ConstantSDNode>(N->getOperand(1));
+    if (!AndC || !AndC->getAPIntValue().isMask())
       return SDValue();
 
-    EVT LoadedVT;
-    bool NarrowLoad = false;
+    unsigned ActiveBits = AndC->getAPIntValue().countTrailingOnes();
     ExtType = ISD::ZEXTLOAD;
-    VT = HasAnyExt ? LN0->getValueType(0) : VT;
-    if (!isAndLoadExtLoad(N1C, LN0, VT, ExtVT, LoadedVT, NarrowLoad))
-      return SDValue();
-
-    if (!NarrowLoad)
-      return DAG.getExtLoad(ISD::ZEXTLOAD, SDLoc(LN0), VT,
-                            LN0->getChain(), LN0->getBasePtr(), ExtVT,
-                            LN0->getMemOperand());
+    ExtVT = EVT::getIntegerVT(*DAG.getContext(), ActiveBits);
   }
   if (LegalOperations && !TLI.isLoadExtLegal(ExtType, VT, ExtVT))
     return SDValue();