1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00
llvm-mirror/test/Transforms/ObjCARC/opt-max-ptr-states.ll
Akira Hatanaka acd6f9ed01 [ObjC][ARC] Let ARC optimizer bail out if the number of pointer states
it keeps track of becomes too large

ARC optimizer does a top-down and a bottom-up traversal of the whole
function to pair up retain and release instructions and remove them.
This can be expensive if the number of instructions in the function and
pointer states it tracks are large since it has to look at each pointer
state and determine whether the instruction being visited can
potentially use the pointer.

This patch adds a command line option that sets a limit to the number of
pointers it tracks.

rdar://problem/49477063

Differential Revision: https://reviews.llvm.org/D61100

llvm-svn: 359226
2019-04-25 19:42:55 +00:00

27 lines
878 B
LLVM

; RUN: opt -objc-arc -S < %s | FileCheck -check-prefix=ENABLE -check-prefix=CHECK %s
; RUN: opt -objc-arc -arc-opt-max-ptr-states=1 -S < %s | FileCheck -check-prefix=DISABLE -check-prefix=CHECK %s
@g0 = common global i8* null, align 8
; CHECK: call i8* @llvm.objc.retain
; ENABLE-NOT: call i8* @llvm.objc.retain
; DISABLE: call i8* @llvm.objc.retain
; CHECK: call void @llvm.objc.release
; ENABLE-NOT: call void @llvm.objc.release
; DISABLE: call void @llvm.objc.release
define void @foo0(i8* %a) {
%1 = tail call i8* @llvm.objc.retain(i8* %a)
%2 = tail call i8* @llvm.objc.retain(i8* %a)
%3 = load i8*, i8** @g0, align 8
store i8* %a, i8** @g0, align 8
tail call void @llvm.objc.release(i8* %3)
tail call void @llvm.objc.release(i8* %a), !clang.imprecise_release !0
ret void
}
declare i8* @llvm.objc.retain(i8*)
declare void @llvm.objc.release(i8*)
!0 = !{}