Files
clang-p2996/llvm/test/Transforms/ObjCARC/split-backedge.ll
Pete Cooper be4f571107 Change the objc ARC optimizer to use the new objc.* intrinsics
We're moving ARC optimisation and ARC emission in clang away from runtime methods
and towards intrinsics.  This is the part which actually uses the intrinsics in the ARC
optimizer when both analyzing the existing calls and emitting new ones.

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

Reviewers: ahatanak
llvm-svn: 349534
2018-12-18 20:32:49 +00:00

51 lines
1.8 KiB
LLVM

; RUN: opt -S -objc-arc < %s | FileCheck %s
; Handle a retain+release pair entirely contained within a split loop backedge.
; rdar://11256239
; CHECK-LABEL: define void @test0(
; CHECK: call i8* @llvm.objc.retain(i8* %call) [[NUW:#[0-9]+]]
; CHECK: call i8* @llvm.objc.retain(i8* %call) [[NUW]]
; CHECK: call i8* @llvm.objc.retain(i8* %cond) [[NUW]]
; CHECK: call void @llvm.objc.release(i8* %call) [[NUW]]
; CHECK: call void @llvm.objc.release(i8* %call) [[NUW]]
; CHECK: call void @llvm.objc.release(i8* %cond) [[NUW]]
define void @test0() personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) {
entry:
br label %while.body
while.body: ; preds = %while.cond
%call = invoke i8* @returner()
to label %invoke.cont unwind label %lpad, !clang.arc.no_objc_arc_exceptions !0
invoke.cont: ; preds = %while.body
%t0 = call i8* @llvm.objc.retain(i8* %call) nounwind
%t1 = call i8* @llvm.objc.retain(i8* %call) nounwind
%call.i1 = invoke i8* @returner()
to label %invoke.cont1 unwind label %lpad
invoke.cont1: ; preds = %invoke.cont
%cond = select i1 undef, i8* null, i8* %call
%t2 = call i8* @llvm.objc.retain(i8* %cond) nounwind
call void @llvm.objc.release(i8* %call) nounwind
call void @llvm.objc.release(i8* %call) nounwind
call void @use_pointer(i8* %cond)
call void @llvm.objc.release(i8* %cond) nounwind
br label %while.body
lpad: ; preds = %invoke.cont, %while.body
%t4 = landingpad { i8*, i32 }
catch i8* null
ret void
}
declare i8* @returner()
declare i32 @__objc_personality_v0(...)
declare void @llvm.objc.release(i8*)
declare i8* @llvm.objc.retain(i8*)
declare void @use_pointer(i8*)
!0 = !{}
; CHECK: attributes [[NUW]] = { nounwind }