From: Daniel Berlin Date: Wed, 20 Sep 2017 00:07:27 +0000 (+0000) Subject: GVNSink: Make ModelledPHIs constructor linear (and avoid edge case it worries about... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7098cc87ae02d1a721cc456c11ab068f5e2ced66;p=llvm GVNSink: Make ModelledPHIs constructor linear (and avoid edge case it worries about) by avoiding getIncomingValueForBlock git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313702 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/GVNSink.cpp b/lib/Transforms/Scalar/GVNSink.cpp index 5fd2dfc118b..01283807184 100644 --- a/lib/Transforms/Scalar/GVNSink.cpp +++ b/lib/Transforms/Scalar/GVNSink.cpp @@ -206,14 +206,15 @@ class ModelledPHI { public: ModelledPHI() {} ModelledPHI(const PHINode *PN) { + // BasicBlock comes first so we sort by basic block pointer order, then by value pointer order. + SmallVector, 4> Ops; for (unsigned I = 0, E = PN->getNumIncomingValues(); I != E; ++I) - Blocks.push_back(PN->getIncomingBlock(I)); - std::sort(Blocks.begin(), Blocks.end()); - - // This assumes the PHI is already well-formed and there aren't conflicting - // incoming values for the same block. - for (auto *B : Blocks) - Values.push_back(PN->getIncomingValueForBlock(B)); + Ops.push_back({PN->getIncomingBlock(I), PN->getIncomingValue(I)}); + std::sort(Ops.begin(), Ops.end()); + for (auto &P : Ops) { + Blocks.push_back(P.first); + Values.push_back(P.second); + } } /// Create a dummy ModelledPHI that will compare unequal to any other ModelledPHI /// without the same ID.