diff options
-rw-r--r-- | llvm/include/llvm/CodeGen/SelectionDAGNodes.h | 3 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 11 |
3 files changed, 7 insertions, 10 deletions
diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h index fa6db629d8d..0f305910aae 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h @@ -842,6 +842,9 @@ public: } // Push deferred nodes back on worklist. Worklist.append(DeferredNodes.begin(), DeferredNodes.end()); + // If we bailed early, conservatively return found. + if (MaxSteps != 0 && Visited.size() >= MaxSteps) + return true; return Found; } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index ef307400d97..12282d92ed8 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -2430,9 +2430,6 @@ HandleMergeInputChains(SmallVectorImpl<SDNode*> &ChainNodesMatched, for (auto *N : ChainNodesMatched) if (SDNode::hasPredecessorHelper(N, Visited, Worklist, Max, true)) return SDValue(); - // Fail conservatively if we stopped searching early. - if (Visited.size() >= Max) - return SDValue(); // Return merged chain. if (InputChains.size() == 1) diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp index 975e8c5e3c2..5313fc68b91 100644 --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -2117,10 +2117,10 @@ static bool isFusableLoadOpStorePattern(StoreSDNode *StoreNode, // this search by visiting the uses and make sure they all have // smaller node id than the load. - bool FoundLoad = false; - SmallVector<SDValue, 4> ChainOps; - SmallVector<const SDNode *, 4> LoopWorklist; - SmallPtrSet<const SDNode *, 16> Visited; + bool FoundLoad = false; + SmallVector<SDValue, 4> ChainOps; + SmallVector<const SDNode *, 4> LoopWorklist; + SmallPtrSet<const SDNode *, 16> Visited; for (unsigned i = 0, e = Chain.getNumOperands(); i != e; ++i) { SDValue Op = Chain.getOperand(i); if (Op == Load.getValue(1)) { @@ -2144,9 +2144,6 @@ static bool isFusableLoadOpStorePattern(StoreSDNode *StoreNode, if (SDNode::hasPredecessorHelper(Load.getNode(), Visited, LoopWorklist, Max, true)) return false; - // Fail conservatively if we ended loop search early. - if (Visited.size() >= Max) - return false; } // Make a new TokenFactor with all the other input chains except |