mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
Fix for bug 1996: optimize out loads of undef. This code basically just
checks for a malloc/alloca immediately followed by a load. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47006 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
add251754c
commit
b6c36e4058
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user