From 642ed1ef7ef0fdca336c37265e896679f64a25d2 Mon Sep 17 00:00:00 2001 From: Nirav Dave Date: Fri, 14 Apr 2017 13:34:30 +0000 Subject: Reorder StoreMergeCandidates to run faster. NFCI. llvm-svn: 300321 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 43 ++++++++++++++------------- 1 file changed, 23 insertions(+), 20 deletions(-) (limited to 'llvm/lib/CodeGen') diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index c947201da2a..4d468551ae2 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -12245,18 +12245,19 @@ void DAGCombiner::getStoreMergeCandidates( if (!(MemVT.isInteger() && MemVT.bitsEq(Other->getMemoryVT()) && isa(Other->getValue()))) return false; - Ptr = BaseIndexOffset::match(Other->getBasePtr(), DAG); - if (!Ptr.equalBaseIndex(BasePtr)) - return false; if (IsLoadSrc) - return isa(Other->getValue()); + if (!isa(Other->getValue())) + return false; if (IsConstantSrc) - return (isa(Other->getValue()) || - isa(Other->getValue())); + if (!(isa(Other->getValue()) || + isa(Other->getValue()))) + return false; if (IsExtractVecSrc) - return (Other->getValue().getOpcode() == ISD::EXTRACT_VECTOR_ELT || - Other->getValue().getOpcode() == ISD::EXTRACT_SUBVECTOR); - return false; + if (!(Other->getValue().getOpcode() == ISD::EXTRACT_VECTOR_ELT || + Other->getValue().getOpcode() == ISD::EXTRACT_SUBVECTOR)) + return false; + Ptr = BaseIndexOffset::match(Other->getBasePtr(), DAG); + return (Ptr.equalBaseIndex(BasePtr)); }; // We looking for a root node which is an ancestor to all mergable // stores. We search up through a load, to our root and then down @@ -12276,23 +12277,25 @@ void DAGCombiner::getStoreMergeCandidates( SDNode *RootNode = (St->getChain()).getNode(); - auto FindInNode = [&](SDNode *P) { - for (auto I = P->use_begin(), E = P->use_end(); I != E; ++I) + if (LoadSDNode *Ldn = dyn_cast(RootNode)) { + RootNode = Ldn->getChain().getNode(); + for (auto I = RootNode->use_begin(), E = RootNode->use_end(); I != E; ++I) + if (I.getOperandNo() == 0 && isa(*I)) // walk down chain + for (auto I2 = (*I)->use_begin(), E2 = (*I)->use_end(); I2 != E2; ++I2) + if (I2.getOperandNo() == 0) + if (StoreSDNode *OtherST = dyn_cast(*I2)) { + BaseIndexOffset Ptr; + if (CandidateMatch(OtherST, Ptr)) + StoreNodes.push_back(MemOpLink(OtherST, Ptr.Offset)); + } + } else + for (auto I = RootNode->use_begin(), E = RootNode->use_end(); I != E; ++I) if (I.getOperandNo() == 0) if (StoreSDNode *OtherST = dyn_cast(*I)) { BaseIndexOffset Ptr; if (CandidateMatch(OtherST, Ptr)) StoreNodes.push_back(MemOpLink(OtherST, Ptr.Offset)); } - }; - - if (LoadSDNode *Ldn = dyn_cast(RootNode)) { - RootNode = Ldn->getChain().getNode(); - for (auto I = RootNode->use_begin(), E = RootNode->use_end(); I != E; ++I) - if (I.getOperandNo() == 0 && isa(*I)) // walk down chain - FindInNode(*I); - } else - FindInNode(RootNode); } // We need to check that merging these stores does not cause a loop -- cgit v1.2.3