mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-08 03:30:22 +00:00
If it's safe to speculatively execute load(alloca) the it's safe to execute
load(gep(alloca)) where the gep is all-zeros. There's more we could do here but this is a common case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108101 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b4a9631e55
commit
8e82e3bf59
@ -401,12 +401,20 @@ bool Instruction::isSafeToSpeculativelyExecute() const {
|
|||||||
return false;
|
return false;
|
||||||
// Note that it is not safe to speculate into a malloc'd region because
|
// Note that it is not safe to speculate into a malloc'd region because
|
||||||
// malloc may return null.
|
// malloc may return null.
|
||||||
if (isa<AllocaInst>(getOperand(0)))
|
// It's also not safe to follow a bitcast, for example:
|
||||||
|
// bitcast i8* (alloca i8) to i32*
|
||||||
|
// would result in a 4-byte load from a 1-byte alloca.
|
||||||
|
Value *Op0 = getOperand(0);
|
||||||
|
if (GEPOperator *GEP = dyn_cast<GEPOperator>(Op0)) {
|
||||||
|
// TODO: it's safe to do this for any GEP with constant indices that
|
||||||
|
// compute inside the allocated type, but not for any inbounds gep.
|
||||||
|
if (GEP->hasAllZeroIndices())
|
||||||
|
Op0 = GEP->getPointerOperand();
|
||||||
|
}
|
||||||
|
if (isa<AllocaInst>(Op0))
|
||||||
return true;
|
return true;
|
||||||
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(getOperand(0)))
|
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(getOperand(0)))
|
||||||
return !GV->hasExternalWeakLinkage();
|
return !GV->hasExternalWeakLinkage();
|
||||||
// FIXME: Handle cases involving GEPs. We have to be careful because
|
|
||||||
// a load of a out-of-bounds GEP has undefined behavior.
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
case Call:
|
case Call:
|
||||||
|
Loading…
Reference in New Issue
Block a user