summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2017-09-20 00:07:27 +0000
committerDaniel Berlin <dberlin@dberlin.org>2017-09-20 00:07:27 +0000
commit064cb68d18f8e9a455c6c9f344e8765f23e14510 (patch)
tree4a8f41886578362e987463af0fc20e5f216cae75
parentdd323297d02bee1e19f82ad8c2f1d887354738d3 (diff)
downloadbcm5719-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.cpp15
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.
OpenPOWER on IntegriCloud