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:
Chris Lattner
2008-12-15 18:59:22 +00:00
parent 464fc5a044
commit 1314f20283
2 changed files with 30 additions and 6 deletions

View File

@ -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;
}