forked from OSchip/llvm-project
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
This commit is contained in:
parent
ec9a589598
commit
7664127f8c
|
@ -2830,7 +2830,12 @@ Value *llvm::GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset,
|
||||||
const DataLayout &DL) {
|
const DataLayout &DL) {
|
||||||
unsigned BitWidth = DL.getPointerTypeSizeInBits(Ptr->getType());
|
unsigned BitWidth = DL.getPointerTypeSizeInBits(Ptr->getType());
|
||||||
APInt ByteOffset(BitWidth, 0);
|
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())
|
if (Ptr->getType()->isVectorTy())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue