diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.h index f423e1ee456cd..00b53b42e2e57 100644 --- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.h +++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.h @@ -216,9 +216,18 @@ class MemDGNode final : public DGNode { /// Memory predecessors. DenseSet MemPreds; friend class PredIterator; // For MemPreds. - - void setNextNode(MemDGNode *N) { NextMemN = N; } - void setPrevNode(MemDGNode *N) { PrevMemN = N; } + /// Creates both edges: this<->N. + void setNextNode(MemDGNode *N) { + NextMemN = N; + if (NextMemN != nullptr) + NextMemN->PrevMemN = this; + } + /// Creates both edges: N<->this. + void setPrevNode(MemDGNode *N) { + PrevMemN = N; + if (PrevMemN != nullptr) + PrevMemN->NextMemN = this; + } friend class DependencyGraph; // For setNextNode(), setPrevNode(). void detachFromChain() { if (PrevMemN != nullptr) diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp index ba62c45a4e704..c1a046a157d3b 100644 --- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp +++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp @@ -283,8 +283,6 @@ void DependencyGraph::createNewNodes(const Interval &NewInterval) { // Build the Mem node chain. if (auto *MemN = dyn_cast(N)) { MemN->setPrevNode(LastMemN); - if (LastMemN != nullptr) - LastMemN->setNextNode(MemN); LastMemN = MemN; } } @@ -302,7 +300,6 @@ void DependencyGraph::createNewNodes(const Interval &NewInterval) { "Wrong order!"); if (LinkTopN != nullptr && LinkBotN != nullptr) { LinkTopN->setNextNode(LinkBotN); - LinkBotN->setPrevNode(LinkTopN); } #ifndef NDEBUG // TODO: Remove this once we've done enough testing. @@ -394,22 +391,14 @@ void DependencyGraph::notifyMoveInstr(Instruction *I, const BBIterator &To) { if (To != BB->end()) { DGNode *ToN = getNodeOrNull(&*To); if (ToN != nullptr) { - MemDGNode *PrevMemN = getMemDGNodeBefore(ToN, /*IncludingN=*/false); - MemDGNode *NextMemN = getMemDGNodeAfter(ToN, /*IncludingN=*/true); - MemN->PrevMemN = PrevMemN; - if (PrevMemN != nullptr) - PrevMemN->NextMemN = MemN; - MemN->NextMemN = NextMemN; - if (NextMemN != nullptr) - NextMemN->PrevMemN = MemN; + MemN->setPrevNode(getMemDGNodeBefore(ToN, /*IncludingN=*/false)); + MemN->setNextNode(getMemDGNodeAfter(ToN, /*IncludingN=*/true)); } } else { // MemN becomes the last instruction in the BB. auto *TermN = getNodeOrNull(BB->getTerminator()); if (TermN != nullptr) { - MemDGNode *PrevMemN = getMemDGNodeBefore(TermN, /*IncludingN=*/false); - PrevMemN->NextMemN = MemN; - MemN->PrevMemN = PrevMemN; + MemN->setPrevNode(getMemDGNodeBefore(TermN, /*IncludingN=*/false)); } else { // The terminator is outside the DAG interval so do nothing. }