diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2016-01-04 07:23:12 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2016-01-04 07:23:12 +0000 |
commit | 7664127f8c949ac3da7003427d87ff4b93e320d2 (patch) | |
tree | b6e3b71684d4552858fb66242e2713c82eb8f983 /llvm/lib/Analysis | |
parent | ec9a589598d2c2103c66584d4134a991fea6841e (diff) | |
download | bcm5719-llvm-7664127f8c949ac3da7003427d87ff4b93e320d2.tar.gz bcm5719-llvm-7664127f8c949ac3da7003427d87ff4b93e320d2.zip |
Fix a horrible infloop in value tracking in the face of dead code.
Amazingly, we just never triggered this without:
1) Moving code around for MetadataTracking so that a certain *different*
amount of inlining occurs in the per-TU compile step.
2) Then you LTO opt or clang with a bootstrap, and get inlining, loop
opts, and GVN line up everything *just* right.
I don't really know how we didn't hit this before. We really need to be
fuzz testing stuff, it shouldn't be hard to trigger. I'm working on
crafting a reduced nice test case, and will submit that when I have it,
but I want to get LTO build bots going again.
llvm-svn: 256735
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index d6a78411388..7e56f1ebe60 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2830,7 +2830,12 @@ Value *llvm::GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const DataLayout &DL) { unsigned BitWidth = DL.getPointerTypeSizeInBits(Ptr->getType()); APInt ByteOffset(BitWidth, 0); - while (1) { + + // We walk up the defs but use a visited set to handle unreachable code. In + // that case, we stop after accumulating the cycle once (not that it + // matters). + SmallPtrSet<Value *, 16> Visited; + while (Visited.insert(Ptr).second) { if (Ptr->getType()->isVectorTy()) break; |