diff options
| author | Daniel Berlin <dberlin@dberlin.org> | 2017-09-20 00:07:27 +0000 |
|---|---|---|
| committer | Daniel Berlin <dberlin@dberlin.org> | 2017-09-20 00:07:27 +0000 |
| commit | 064cb68d18f8e9a455c6c9f344e8765f23e14510 (patch) | |
| tree | 4a8f41886578362e987463af0fc20e5f216cae75 | |
| parent | dd323297d02bee1e19f82ad8c2f1d887354738d3 (diff) | |
| download | bcm5719-llvm-064cb68d18f8e9a455c6c9f344e8765f23e14510.tar.gz bcm5719-llvm-064cb68d18f8e9a455c6c9f344e8765f23e14510.zip | |
GVNSink: Make ModelledPHIs constructor linear (and avoid edge case it worries about) by avoiding getIncomingValueForBlock
llvm-svn: 313702
| -rw-r--r-- | llvm/lib/Transforms/Scalar/GVNSink.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVNSink.cpp b/llvm/lib/Transforms/Scalar/GVNSink.cpp index 5fd2dfc118b..01283807184 100644 --- a/llvm/lib/Transforms/Scalar/GVNSink.cpp +++ b/llvm/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<std::pair<BasicBlock *, Value *>, 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. |

