diff --git a/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp b/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp index 02c67e500bdca..952f454f8f6a2 100644 --- a/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp +++ b/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp @@ -226,6 +226,7 @@ class ComplexDeinterleavingGraph { const TargetLowering *TL = nullptr; const TargetLibraryInfo *TLI = nullptr; SmallVector CompositeNodes; + DenseMap, NodePtr> CachedResult; SmallPtrSet FinalInstructions; @@ -292,17 +293,11 @@ class ComplexDeinterleavingGraph { NodePtr submitCompositeNode(NodePtr Node) { CompositeNodes.push_back(Node); + if (Node->Real && Node->Imag) + CachedResult[{Node->Real, Node->Imag}] = Node; return Node; } - NodePtr getContainingComposite(Value *R, Value *I) { - for (const auto &CN : CompositeNodes) { - if (CN->Real == R && CN->Imag == I) - return CN; - } - return nullptr; - } - /// Identifies a complex partial multiply pattern and its rotation, based on /// the following patterns /// @@ -900,9 +895,11 @@ ComplexDeinterleavingGraph::identifyNode(Value *R, Value *I) { LLVM_DEBUG(dbgs() << "identifyNode on " << *R << " / " << *I << "\n"); assert(R->getType() == I->getType() && "Real and imaginary parts should not have different types"); - if (NodePtr CN = getContainingComposite(R, I)) { + + auto It = CachedResult.find({R, I}); + if (It != CachedResult.end()) { LLVM_DEBUG(dbgs() << " - Folding to existing node\n"); - return CN; + return It->second; } if (NodePtr CN = identifySplat(R, I)) @@ -949,6 +946,7 @@ ComplexDeinterleavingGraph::identifyNode(Value *R, Value *I) { return CN; LLVM_DEBUG(dbgs() << " - Not recognised as a valid pattern.\n"); + CachedResult[{R, I}] = nullptr; return nullptr; }