diff options
author | Michael Zolotukhin <mzolotukhin@apple.com> | 2018-05-12 01:44:32 +0000 |
---|---|---|
committer | Michael Zolotukhin <mzolotukhin@apple.com> | 2018-05-12 01:44:32 +0000 |
commit | 046da9780665dd8e951b48e475ee03cf7da34fd4 (patch) | |
tree | 762226edcf8eec2b4c6fb1194d4e6c1045257b3c /llvm/lib/Analysis/IteratedDominanceFrontier.cpp | |
parent | 7012c246c10b456ee0b317b41d04c7addc3eb35b (diff) | |
download | bcm5719-llvm-046da9780665dd8e951b48e475ee03cf7da34fd4.tar.gz bcm5719-llvm-046da9780665dd8e951b48e475ee03cf7da34fd4.zip |
[IDF] Enforce the returned blocks to be sorted.
Summary:
Currently the order of blocks returned by `IDF::calculate` can be
non-deterministic. This was discovered in several attempts to enable
SSAUpdaterBulk for JumpThreading (which led to miscompare in bootstrap between
stage 3 and stage4). Originally, the blocks were put into a priority queue with
a depth level as their key, and this patch adds a DFSIn number as a second key
to specify a deterministic order across blocks from one level.
The solution was suggested by Daniel Berlin.
Reviewers: dberlin, davide
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D46646
llvm-svn: 332167
Diffstat (limited to 'llvm/lib/Analysis/IteratedDominanceFrontier.cpp')
-rw-r--r-- | llvm/lib/Analysis/IteratedDominanceFrontier.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/IteratedDominanceFrontier.cpp b/llvm/lib/Analysis/IteratedDominanceFrontier.cpp index 3992657417c..e7751d32aab 100644 --- a/llvm/lib/Analysis/IteratedDominanceFrontier.cpp +++ b/llvm/lib/Analysis/IteratedDominanceFrontier.cpp @@ -21,15 +21,20 @@ template <class NodeTy, bool IsPostDom> void IDFCalculator<NodeTy, IsPostDom>::calculate( SmallVectorImpl<BasicBlock *> &PHIBlocks) { // Use a priority queue keyed on dominator tree level so that inserted nodes - // are handled from the bottom of the dominator tree upwards. - typedef std::pair<DomTreeNode *, unsigned> DomTreeNodePair; + // are handled from the bottom of the dominator tree upwards. We also augment + // the level with a DFS number to ensure that the blocks are ordered in a + // deterministic way. + typedef std::pair<DomTreeNode *, std::pair<unsigned, unsigned>> + DomTreeNodePair; typedef std::priority_queue<DomTreeNodePair, SmallVector<DomTreeNodePair, 32>, less_second> IDFPriorityQueue; IDFPriorityQueue PQ; + DT.updateDFSNumbers(); + for (BasicBlock *BB : *DefBlocks) { if (DomTreeNode *Node = DT.getNode(BB)) - PQ.push({Node, Node->getLevel()}); + PQ.push({Node, std::make_pair(Node->getLevel(), Node->getDFSNumIn())}); } SmallVector<DomTreeNode *, 32> Worklist; @@ -40,7 +45,7 @@ void IDFCalculator<NodeTy, IsPostDom>::calculate( DomTreeNodePair RootPair = PQ.top(); PQ.pop(); DomTreeNode *Root = RootPair.first; - unsigned RootLevel = RootPair.second; + unsigned RootLevel = RootPair.second.first; // Walk all dominator tree children of Root, inspecting their CFG edges with // targets elsewhere on the dominator tree. Only targets whose level is at @@ -77,7 +82,8 @@ void IDFCalculator<NodeTy, IsPostDom>::calculate( PHIBlocks.emplace_back(SuccBB); if (!DefBlocks->count(SuccBB)) - PQ.push(std::make_pair(SuccNode, SuccLevel)); + PQ.push(std::make_pair( + SuccNode, std::make_pair(SuccLevel, SuccNode->getDFSNumIn()))); } for (auto DomChild : *Node) { |