[PATCH] D46646: [IDF] Enforce the returned blocks to be sorted.
Michael Zolotukhin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 9 09:40:24 PDT 2018
mzolotukhin created this revision.
mzolotukhin added reviewers: dberlin, davide.
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.
Repository:
rL LLVM
https://reviews.llvm.org/D46646
Files:
lib/Analysis/IteratedDominanceFrontier.cpp
Index: lib/Analysis/IteratedDominanceFrontier.cpp
===================================================================
--- lib/Analysis/IteratedDominanceFrontier.cpp
+++ lib/Analysis/IteratedDominanceFrontier.cpp
@@ -21,15 +21,20 @@
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 @@
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 @@
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) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46646.145945.patch
Type: text/x-patch
Size: 1960 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180509/6418c910/attachment.bin>
More information about the llvm-commits
mailing list