mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 08:17:40 +00:00
Factor out Instruction::isSafeToSpeculativelyExecute's code for
testing for dereferenceable pointers into a helper function, isDereferenceablePointer. Teach it how to reason about GEPs with simple non-zero indices. Also eliminate ArgumentPromtion's IsAlwaysValidPointer, which didn't check for weak externals or out of range gep indices. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118840 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -188,19 +188,6 @@ CallGraphNode *ArgPromotion::PromoteArguments(CallGraphNode *CGN) {
|
||||
return DoPromotion(F, ArgsToPromote, ByValArgsToTransform);
|
||||
}
|
||||
|
||||
/// IsAlwaysValidPointer - Return true if the specified pointer is always legal
|
||||
/// to load.
|
||||
static bool IsAlwaysValidPointer(Value *V) {
|
||||
if (isa<AllocaInst>(V) || isa<GlobalVariable>(V)) return true;
|
||||
if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(V))
|
||||
return IsAlwaysValidPointer(GEP->getOperand(0));
|
||||
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
|
||||
if (CE->getOpcode() == Instruction::GetElementPtr)
|
||||
return IsAlwaysValidPointer(CE->getOperand(0));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// AllCalleesPassInValidPointerForArgument - Return true if we can prove that
|
||||
/// all callees pass in a valid pointer for the specified function argument.
|
||||
static bool AllCalleesPassInValidPointerForArgument(Argument *Arg) {
|
||||
@@ -216,7 +203,7 @@ static bool AllCalleesPassInValidPointerForArgument(Argument *Arg) {
|
||||
CallSite CS(*UI);
|
||||
assert(CS && "Should only have direct calls!");
|
||||
|
||||
if (!IsAlwaysValidPointer(CS.getArgument(ArgNo)))
|
||||
if (!CS.getArgument(ArgNo)->isDereferenceablePointer())
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user