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

View File

@ -0,0 +1,13 @@
; RUN: llvm-as < %s | opt -basicaa -gvn -instcombine | llvm-dis | grep {ret i32 0}
declare i32* @test(i32* nocapture)
define i32 @test2() {
%P = alloca i32
%Q = call i32* @test(i32* %P)
%a = load i32* %P
store i32 4, i32* %Q ;; cannot clobber P since it is nocapture.
%b = load i32* %P
%c = sub i32 %a, %b
ret i32 %c
}