forked from OSchip/llvm-project
Constant pointers to objects don't need reference counting.
llvm-svn: 138242
This commit is contained in:
parent
bce94fded8
commit
56e1cef705
|
@ -515,6 +515,10 @@ static bool IsObjCIdentifiedObject(const Value *V) {
|
|||
const Value *Pointer =
|
||||
StripPointerCastsAndObjCCalls(LI->getPointerOperand());
|
||||
if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(Pointer)) {
|
||||
// A constant pointer can't be pointing to an object on the heap. It may
|
||||
// be reference-counted, but it won't be deleted.
|
||||
if (GV->isConstant())
|
||||
return true;
|
||||
StringRef Name = GV->getName();
|
||||
// These special variables are known to hold values which are not
|
||||
// reference-counted pointers.
|
||||
|
@ -2744,6 +2748,15 @@ ObjCARCOpt::PerformCodePlacement(DenseMap<const BasicBlock *, BBState>
|
|||
// regardless of what possible decrements or uses lie between them.
|
||||
bool KnownSafe = isa<Constant>(Arg) || isa<AllocaInst>(Arg);
|
||||
|
||||
// A constant pointer can't be pointing to an object on the heap. It may
|
||||
// be reference-counted, but it won't be deleted.
|
||||
if (const LoadInst *LI = dyn_cast<LoadInst>(Arg))
|
||||
if (const GlobalVariable *GV =
|
||||
dyn_cast<GlobalVariable>(
|
||||
StripPointerCastsAndObjCCalls(LI->getPointerOperand())))
|
||||
if (GV->isConstant())
|
||||
KnownSafe = true;
|
||||
|
||||
// If a pair happens in a region where it is known that the reference count
|
||||
// is already incremented, we can similarly ignore possible decrements.
|
||||
bool KnownSafeTD = true, KnownSafeBU = true;
|
||||
|
|
|
@ -1638,6 +1638,39 @@ entry:
|
|||
ret void
|
||||
}
|
||||
|
||||
; Constant pointers to objects don't need reference counting.
|
||||
|
||||
@constptr = external constant i8*
|
||||
@something = external global i8*
|
||||
|
||||
; CHECK: define void @test60(
|
||||
; CHECK-NOT: @objc_
|
||||
; CHECK: }
|
||||
define void @test60() {
|
||||
%t = load i8** @constptr
|
||||
%s = load i8** @something
|
||||
call i8* @objc_retain(i8* %s)
|
||||
call void @callee()
|
||||
call void @use_pointer(i8* %t)
|
||||
call void @objc_release(i8* %s)
|
||||
ret void
|
||||
}
|
||||
|
||||
; Constant pointers to objects don't need to be considered related to other
|
||||
; pointers.
|
||||
|
||||
; CHECK: define void @test61(
|
||||
; CHECK-NOT: @objc_
|
||||
; CHECK: }
|
||||
define void @test61() {
|
||||
%t = load i8** @constptr
|
||||
call i8* @objc_retain(i8* %t)
|
||||
call void @callee()
|
||||
call void @use_pointer(i8* %t)
|
||||
call void @objc_release(i8* %t)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @bar(i32 ()*)
|
||||
|
||||
; A few real-world testcases.
|
||||
|
|
Loading…
Reference in New Issue