Fix for bug 1996: optimize out loads of undef. This code basically just

checks for a malloc/alloca immediately followed by a load.

llvm-svn: 47006
This commit is contained in:
Eli Friedman 2008-02-12 12:08:14 +00:00
parent a7bf7ed476
commit 716c10c01e
1 changed files with 28 additions and 1 deletions

View File

@ -1010,7 +1010,34 @@ bool GVN::processLoad(LoadInst* L,
dep = MD.getDependency(L, dep);
}
}
if (dep != MemoryDependenceAnalysis::None &&
dep != MemoryDependenceAnalysis::NonLocal &&
isa<AllocationInst>(dep)) {
// Check that this load is actually from the
// allocation we found
Value* v = L->getOperand(0);
while (true) {
if (BitCastInst *BC = dyn_cast<BitCastInst>(v))
v = BC->getOperand(0);
else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(v))
v = GEP->getOperand(0);
else
break;
}
if (v == dep) {
// If this load depends directly on an allocation, there isn't
// anything stored there; therefore, we can optimize this load
// to undef.
MD.removeInstruction(L);
L->replaceAllUsesWith(UndefValue::get(L->getType()));
toErase.push_back(L);
deletedLoad = true;
NumGVNLoad++;
}
}
if (!deletedLoad)
last = L;