1 ; RUN: opt -S -objc-arc < %s | FileCheck %s
4 ; Detect loop boundaries and don't move retains and releases
7 declare void @use_pointer(i8*)
8 declare i8* @objc_retain(i8*)
9 declare void @objc_release(i8*)
11 ; CHECK: define void @test0(
12 ; CHECK: call i8* @objc_retain(
16 ; CHECK: call void @objc_release(
18 define void @test0(i8* %digits) {
20 %tmp1 = call i8* @objc_retain(i8* %digits) nounwind
21 call void @use_pointer(i8* %tmp1)
24 for.body: ; preds = %for.body, %entry
25 %upcDigitIndex.01 = phi i64 [ 2, %entry ], [ %inc, %for.body ]
26 call void @use_pointer(i8* %tmp1)
27 %inc = add i64 %upcDigitIndex.01, 1
28 %cmp = icmp ult i64 %inc, 12
29 br i1 %cmp, label %for.body, label %for.end
31 for.end: ; preds = %for.body
32 call void @objc_release(i8* %tmp1) nounwind, !clang.imprecise_release !0
36 ; CHECK: define void @test1(
37 ; CHECK: call i8* @objc_retain(
41 ; CHECK: void @objc_release(
43 define void @test1(i8* %digits) {
45 %tmp1 = call i8* @objc_retain(i8* %digits) nounwind
48 for.body: ; preds = %for.body, %entry
49 %upcDigitIndex.01 = phi i64 [ 2, %entry ], [ %inc, %for.body ]
50 call void @use_pointer(i8* %tmp1)
51 call void @use_pointer(i8* %tmp1)
52 %inc = add i64 %upcDigitIndex.01, 1
53 %cmp = icmp ult i64 %inc, 12
54 br i1 %cmp, label %for.body, label %for.end
56 for.end: ; preds = %for.body
57 call void @objc_release(i8* %tmp1) nounwind, !clang.imprecise_release !0
61 ; CHECK: define void @test2(
62 ; CHECK: call i8* @objc_retain(
66 ; CHECK: void @objc_release(
68 define void @test2(i8* %digits) {
70 %tmp1 = call i8* @objc_retain(i8* %digits) nounwind
73 for.body: ; preds = %for.body, %entry
74 %upcDigitIndex.01 = phi i64 [ 2, %entry ], [ %inc, %for.body ]
75 call void @use_pointer(i8* %tmp1)
76 %inc = add i64 %upcDigitIndex.01, 1
77 %cmp = icmp ult i64 %inc, 12
78 br i1 %cmp, label %for.body, label %for.end
80 for.end: ; preds = %for.body
81 call void @use_pointer(i8* %tmp1)
82 call void @objc_release(i8* %tmp1) nounwind, !clang.imprecise_release !0