OSDN Git Service

GVNSink: Make ModelledPHIs constructor linear (and avoid edge case it worries about...
authorDaniel Berlin <dberlin@dberlin.org>
Wed, 20 Sep 2017 00:07:27 +0000 (00:07 +0000)
committerDaniel Berlin <dberlin@dberlin.org>
Wed, 20 Sep 2017 00:07:27 +0000 (00:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313702 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/GVNSink.cpp

index 5fd2dfc..0128380 100644 (file)
@@ -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.