From: Eli Friedman Date: Fri, 1 Dec 2017 19:33:56 +0000 (+0000) Subject: [DAGCombine] Simplify ISD::AND handling in ReduceLoadWidth X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=52eba828c1a59929a1c1d11d4e74c4046b8f2c6b;p=llvm [DAGCombine] Simplify ISD::AND handling in ReduceLoadWidth 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 --- diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index f04010abb46..2fa5d0a4a3a 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -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(N0.getOperand(0)) : cast(N0); - - if (LN0->getExtensionType() == ISD::SEXTLOAD || - !LN0->isUnindexed() || !N0.hasOneUse() || !SDValue(LN0, 0).hasOneUse()) - return SDValue(); - - auto N1C = dyn_cast(N->getOperand(1)); - if (!N1C) + // An AND with a constant mask is the same as a truncate + zero-extend. + auto AndC = dyn_cast(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();