mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-18 11:24:01 +00:00
Teach basicaa to use the nocapture attribute when possible. When the
intrinsics are properly marked nocapture, the fixme should be addressed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61040 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -63,12 +63,23 @@ static bool AddressMightEscape(const Value *V) {
|
||||
// callees could modify it.
|
||||
break; // next use
|
||||
case Instruction::Call:
|
||||
// If the call is to a few known safe intrinsics, we know that it does
|
||||
// not escape.
|
||||
// TODO: Eventually just check the 'nocapture' attribute.
|
||||
if (!isa<MemIntrinsic>(I))
|
||||
return true;
|
||||
break; // next use
|
||||
// If the argument to the call has the nocapture attribute, then the call
|
||||
// may store or load to the pointer, but it cannot escape.
|
||||
if (cast<CallInst>(I)->paramHasAttr(UI.getOperandNo(),
|
||||
Attribute::NoCapture))
|
||||
continue;
|
||||
|
||||
// FIXME: MemIntrinsics should have their operands marked nocapture!
|
||||
if (isa<MemIntrinsic>(I))
|
||||
continue; // next use
|
||||
return true;
|
||||
case Instruction::Invoke:
|
||||
// If the argument to the call has the nocapture attribute, then the call
|
||||
// may store or load to the pointer, but it cannot escape.
|
||||
if (cast<InvokeInst>(I)->paramHasAttr(UI.getOperandNo()-2,
|
||||
Attribute::NoCapture))
|
||||
continue;
|
||||
return true;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user