summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorPhilip Reames <listmail@philipreames.com>2015-09-03 20:24:29 +0000
committerPhilip Reames <listmail@philipreames.com>2015-09-03 20:24:29 +0000
commit246e618e77cdf137c9647408bdbbc93d00cbf413 (patch)
tree20fcd82475311031f423b3b9fde49d712886f76b /llvm/lib/Transforms
parent9838b2be87a889c72e38557866c0741cc630b167 (diff)
downloadbcm5719-llvm-246e618e77cdf137c9647408bdbbc93d00cbf413.tar.gz
bcm5719-llvm-246e618e77cdf137c9647408bdbbc93d00cbf413.zip
[RewriteStatepointsForGC] Workaround a lack of determinism in visit order
The visit order being used in the base pointer inference algorithm is currently non-deterministic. When working on http://reviews.llvm.org/D12583, I discovered that we were relying on a peephole optimization to get deterministic ordering in one of the test cases. This change is intented to let me test and land http://reviews.llvm.org/D12583. The current code will not be long lived. I'm starting to investigate a rewrite of the algorithm which will combine the post-process step into the initial algorithm and make the visit order determistic. Before doing that, I wanted to make sure the existing code was complete and the test were stable. Hopefully, patches should be up for review for the new algorithm this week or early next. llvm-svn: 246801
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
index 4153e64e201..d9dd80249de 100644
--- a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
+++ b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
@@ -1026,14 +1026,19 @@ static Value *findBasePointer(Value *I, DefiningValueMapTy &cache) {
DenseMap<Value *, Value *> ReverseMap;
SmallPtrSet<Instruction *, 16> NewInsts;
SmallSetVector<AssertingVH<Instruction>, 16> Worklist;
- for (auto Item : states) {
- Value *V = Item.first;
- Value *Base = Item.second.getBase();
+ // Note: We need to visit the states in a deterministic order. We uses the
+ // Keys we sorted above for this purpose. Note that we are papering over a
+ // bigger problem with the algorithm above - it's visit order is not
+ // deterministic. A larger change is needed to fix this.
+ for (auto Key : Keys) {
+ Value *V = Key;
+ auto State = states[Key];
+ Value *Base = State.getBase();
assert(V && Base);
assert(!isKnownBaseResult(V) && "why did it get added?");
assert(isKnownBaseResult(Base) &&
"must be something we 'know' is a base pointer");
- if (!Item.second.isConflict())
+ if (!State.isConflict())
continue;
ReverseMap[Base] = V;
OpenPOWER on IntegriCloud