mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-20 11:32:33 +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:
parent
464fc5a044
commit
1314f20283
@ -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;
|
||||
}
|
||||
|
13
test/Analysis/BasicAA/nocapture.ll
Normal file
13
test/Analysis/BasicAA/nocapture.ll
Normal 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user