summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff options
context:
space:
mode:
authorVlad Tsyrklevich <vlad@tsyrklevich.net>2017-12-06 01:16:08 +0000
committerVlad Tsyrklevich <vlad@tsyrklevich.net>2017-12-06 01:16:08 +0000
commit0b40f21134641599c291229739477c4c6e0350f1 (patch)
treeec43f1886ee910cc74c80e7972e5011d4f46e7f1 /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
parent993447c8301fd7dbb28cc5dfed0fa4d3660d045b (diff)
downloadbcm5719-llvm-0b40f21134641599c291229739477c4c6e0350f1.tar.gz
bcm5719-llvm-0b40f21134641599c291229739477c4c6e0350f1.zip
Revert "[DAGCombine] Move AND nodes to multiple load leaves"
This reverts commit r319773. It was causing some buildbots to hang, e.g. http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-android/builds/5589 llvm-svn: 319867
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp123
1 files changed, 0 insertions, 123 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index bf619c81133..7f02a643c0a 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -505,14 +505,6 @@ namespace {
bool isLegalNarrowLoad(LoadSDNode *LoadN, ISD::LoadExtType ExtType,
EVT &ExtVT, unsigned ShAmt = 0);
- /// Used by BackwardsPropagateMask to find suitable loads.
- bool SearchForAndLoads(SDNode *N, SmallPtrSetImpl<LoadSDNode*> &Loads,
- ConstantSDNode *Mask, SDNode *&UncombinedNode);
-
- /// Attempt to propagate a given AND node back to load leaves so that they
- /// can be combined into narrow loads.
- bool BackwardsPropagateMask(SDNode *N, SelectionDAG &DAG);
-
/// Helper function for MergeConsecutiveStores which merges the
/// component store chains.
SDValue getMergeStoreChains(SmallVectorImpl<MemOpLink> &StoreNodes,
@@ -3789,111 +3781,6 @@ bool DAGCombiner::isLegalNarrowLoad(LoadSDNode *LoadN, ISD::LoadExtType ExtType,
return true;
}
-bool DAGCombiner::SearchForAndLoads(SDNode *N,
- SmallPtrSetImpl<LoadSDNode*> &Loads,
- ConstantSDNode *Mask,
- SDNode *&NodeToMask) {
- // Recursively search for the operands, looking for loads which can be
- // narrowed.
- for (unsigned i = 0, e = N->getNumOperands(); i < e; ++i) {
- SDValue Op = N->getOperand(i);
-
- // Constants should already be fixed up...
- if (isa<ConstantSDNode>(Op))
- continue;
-
- if (!Op.hasOneUse() || Op.getValueType().isVector())
- return false;
-
- switch(Op.getOpcode()) {
- case ISD::LOAD: {
- auto *Load = cast<LoadSDNode>(Op);
- EVT ExtVT;
- if (isAndLoadExtLoad(Mask, Load, Load->getValueType(0), ExtVT) &&
- isLegalNarrowLoad(Load, ISD::ZEXTLOAD, ExtVT)) {
- Loads.insert(Load);
- continue;
- }
- return false;
- }
- case ISD::ZERO_EXTEND:
- case ISD::ANY_EXTEND:
- case ISD::AssertZext: {
- unsigned ActiveBits = Mask->getAPIntValue().countTrailingOnes();
- EVT ExtVT = EVT::getIntegerVT(*DAG.getContext(), ActiveBits);
- EVT VT = Op.getOpcode() == ISD::AssertZext ?
- cast<VTSDNode>(Op.getOperand(1))->getVT() :
- Op.getOperand(0).getValueType();
-
- // We can accept extending nodes if the mask is wider or an equal
- // width to the original type.
- if (ExtVT.bitsGE(VT))
- continue;
- break;
- }
- case ISD::OR:
- case ISD::XOR:
- case ISD::AND:
- if (!SearchForAndLoads(Op.getNode(), Loads, Mask, NodeToMask))
- return false;
- continue;
- }
-
- // Allow one node which will masked along with any loads found.
- if (NodeToMask)
- return false;
- NodeToMask = Op.getNode();
- }
- return true;
-}
-
-bool DAGCombiner::BackwardsPropagateMask(SDNode *N, SelectionDAG &DAG) {
- auto *Mask = dyn_cast<ConstantSDNode>(N->getOperand(1));
- if (!Mask)
- return false;
-
- if (!Mask->getAPIntValue().isMask())
- return false;
-
- // No need to do anything if the and directly uses a load.
- if (isa<LoadSDNode>(N->getOperand(0)))
- return false;
-
- SmallPtrSet<LoadSDNode*, 8> Loads;
- SDNode *FixupNode = nullptr;
- if (SearchForAndLoads(N, Loads, Mask, FixupNode)) {
- if (Loads.size() == 0)
- return false;
-
- SDValue MaskOp = N->getOperand(1);
-
- // If it exists, fixup the single node we allow in the tree that needs
- // masking.
- if (FixupNode) {
- SDValue And = DAG.getNode(ISD::AND, SDLoc(FixupNode),
- FixupNode->getValueType(0),
- SDValue(FixupNode, 0), MaskOp);
- DAG.ReplaceAllUsesOfValueWith(SDValue(FixupNode, 0), And);
- DAG.UpdateNodeOperands(And.getNode(), SDValue(FixupNode, 0),
- MaskOp);
- }
-
- for (auto *Load : Loads) {
- SDValue And = DAG.getNode(ISD::AND, SDLoc(Load), Load->getValueType(0),
- SDValue(Load, 0), MaskOp);
- DAG.ReplaceAllUsesOfValueWith(SDValue(Load, 0), And);
- DAG.UpdateNodeOperands(And.getNode(), SDValue(Load, 0), MaskOp);
- SDValue NewLoad = ReduceLoadWidth(And.getNode());
- assert(NewLoad &&
- "Shouldn't be masking the load if it can't be narrowed");
- CombineTo(Load, NewLoad, NewLoad.getValue(1));
- }
- DAG.ReplaceAllUsesWith(N, N->getOperand(0).getNode());
- return true;
- }
- return false;
-}
-
SDValue DAGCombiner::visitAND(SDNode *N) {
SDValue N0 = N->getOperand(0);
SDValue N1 = N->getOperand(1);
@@ -4095,16 +3982,6 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
}
}
- if (Level >= AfterLegalizeTypes) {
- // Attempt to propagate the AND back up to the leaves which, if they're
- // loads, can be combined to narrow loads and the AND node can be removed.
- // Perform after legalization so that extend nodes will already be
- // combined into the loads.
- if (BackwardsPropagateMask(N, DAG)) {
- return SDValue(N, 0);
- }
- }
-
if (SDValue Combined = visitANDLike(N0, N1, N))
return Combined;
OpenPOWER on IntegriCloud