xref: /llvm-project/llvm/test/Transforms/ObjCARC/split-backedge.ll (revision 01e4f41b43b57dee751146fde9992c660bd7c714)
1; RUN: opt -S -passes=objc-arc < %s | FileCheck %s
2
3; Handle a retain+release pair entirely contained within a split loop backedge.
4; rdar://11256239
5
6; CHECK-LABEL: define void @test0(
7; CHECK: call ptr @llvm.objc.retain(ptr %call) [[NUW:#[0-9]+]]
8; CHECK: call ptr @llvm.objc.retain(ptr %call) [[NUW]]
9; CHECK: call ptr @llvm.objc.retain(ptr %cond) [[NUW]]
10; CHECK: call void @llvm.objc.release(ptr %call) [[NUW]]
11; CHECK: call void @llvm.objc.release(ptr %call) [[NUW]]
12; CHECK: call void @llvm.objc.release(ptr %cond) [[NUW]]
13define void @test0() personality ptr @__objc_personality_v0 {
14entry:
15  br label %while.body
16
17while.body:                                       ; preds = %while.cond
18  %call = invoke ptr @returner()
19          to label %invoke.cont unwind label %lpad, !clang.arc.no_objc_arc_exceptions !0
20
21invoke.cont:                                      ; preds = %while.body
22  %t0 = call ptr @llvm.objc.retain(ptr %call) nounwind
23  %t1 = call ptr @llvm.objc.retain(ptr %call) nounwind
24  %call.i1 = invoke ptr @returner()
25          to label %invoke.cont1 unwind label %lpad
26
27invoke.cont1:                                     ; preds = %invoke.cont
28  %cond = select i1 undef, ptr null, ptr %call
29  %t2 = call ptr @llvm.objc.retain(ptr %cond) nounwind
30  call void @llvm.objc.release(ptr %call) nounwind
31  call void @llvm.objc.release(ptr %call) nounwind
32  call void @use_pointer(ptr %cond)
33  call void @llvm.objc.release(ptr %cond) nounwind
34  br label %while.body
35
36lpad:                                             ; preds = %invoke.cont, %while.body
37  %t4 = landingpad { ptr, i32 }
38          catch ptr null
39  ret void
40}
41
42declare ptr @returner()
43declare i32 @__objc_personality_v0(...)
44declare void @llvm.objc.release(ptr)
45declare ptr @llvm.objc.retain(ptr)
46declare void @use_pointer(ptr)
47
48!0 = !{}
49
50; CHECK: attributes [[NUW]] = { nounwind }
51