Skip to content

Commit a65ecc4

Browse files
committed
Precommit test cases in https://reviews.llvm.org/D104953
(cherry picked from commit 76dd98e)
1 parent 6594a47 commit a65ecc4

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

llvm/test/Transforms/ObjCARC/code-motion.ll

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
declare void @alterRefCount()
44
declare void @use(i8*)
5+
declare void @readOnlyFunc(i8*, i8*)
56

67
@g0 = global i8* null, align 8
78

@@ -38,10 +39,99 @@ define void @test2() {
3839
ret void
3940
}
4041

42+
; ARC optimizer shouldn't reverse the order of retains and releases in
43+
; if.then in @test3 and @test4.
44+
45+
define void @test3(i8* %obj, i1 %cond) {
46+
; CHECK-LABEL: @test3(
47+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
48+
; CHECK: if.then:
49+
; CHECK-NEXT: call void @readOnlyFunc(i8* [[OBJ:%.*]], i8* null)
50+
; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ]]) {{.*}}, !clang.imprecise_release !2
51+
; CHECK-NEXT: [[TMP1:%.*]] = add i32 1, 2
52+
; CHECK-NEXT: [[TMP2:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ]])
53+
; CHECK-NEXT: call void @alterRefCount()
54+
; CHECK-NEXT: br label [[JOIN:%.*]]
55+
; CHECK: if.else:
56+
; CHECK-NEXT: [[TMP3:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ]])
57+
; CHECK-NEXT: call void @alterRefCount()
58+
; CHECK-NEXT: call void @use(i8* [[OBJ]])
59+
; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ]]) {{.*}}, !clang.imprecise_release !2
60+
; CHECK-NEXT: br label [[JOIN]]
61+
; CHECK: join:
62+
; CHECK-NEXT: ret void
63+
;
64+
%v0 = call i8* @llvm.objc.retain(i8* %obj)
65+
br i1 %cond, label %if.then, label %if.else
66+
67+
if.then:
68+
call void @readOnlyFunc(i8* %obj, i8* null) #0
69+
add i32 1, 2
70+
call void @alterRefCount()
71+
br label %join
72+
73+
if.else:
74+
call void @alterRefCount()
75+
call void @use(i8* %obj)
76+
br label %join
77+
78+
join:
79+
call void @llvm.objc.release(i8* %obj), !clang.imprecise_release !9
80+
ret void
81+
}
82+
83+
define void @test4(i8* %obj0, i8* %obj1, i1 %cond) {
84+
; CHECK-LABEL: @test4(
85+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
86+
; CHECK: if.then:
87+
; CHECK-NEXT: call void @readOnlyFunc(i8* [[OBJ0:%.*]], i8* [[OBJ1:%.*]])
88+
; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ1]]) {{.*}}, !clang.imprecise_release !2
89+
; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ0]]) {{.*}}, !clang.imprecise_release !2
90+
; CHECK-NEXT: [[TMP1:%.*]] = add i32 1, 2
91+
; CHECK-NEXT: [[TMP2:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ1]])
92+
; CHECK-NEXT: [[TMP3:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ0]])
93+
; CHECK-NEXT: call void @alterRefCount()
94+
; CHECK-NEXT: br label [[JOIN:%.*]]
95+
; CHECK: if.else:
96+
; CHECK-NEXT: [[TMP4:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ1]])
97+
; CHECK-NEXT: [[TMP5:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ0]])
98+
; CHECK-NEXT: call void @alterRefCount()
99+
; CHECK-NEXT: call void @use(i8* [[OBJ0]])
100+
; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ0]]) {{.*}}, !clang.imprecise_release !2
101+
; CHECK-NEXT: call void @use(i8* [[OBJ1]])
102+
; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ1]]) {{.*}}, !clang.imprecise_release !2
103+
; CHECK-NEXT: br label [[JOIN]]
104+
; CHECK: join:
105+
; CHECK-NEXT: ret void
106+
;
107+
%v0 = call i8* @llvm.objc.retain(i8* %obj0)
108+
%v1 = call i8* @llvm.objc.retain(i8* %obj1)
109+
br i1 %cond, label %if.then, label %if.else
110+
111+
if.then:
112+
call void @readOnlyFunc(i8* %obj0, i8* %obj1) #0
113+
add i32 1, 2
114+
call void @alterRefCount()
115+
br label %join
116+
117+
if.else:
118+
call void @alterRefCount()
119+
call void @use(i8* %obj0)
120+
call void @use(i8* %obj1)
121+
br label %join
122+
123+
join:
124+
call void @llvm.objc.release(i8* %obj0), !clang.imprecise_release !9
125+
call void @llvm.objc.release(i8* %obj1), !clang.imprecise_release !9
126+
ret void
127+
}
128+
41129
declare void @llvm.dbg.declare(metadata, metadata, metadata)
42130
declare i8* @llvm.objc.retain(i8*) local_unnamed_addr
43131
declare void @llvm.objc.release(i8*) local_unnamed_addr
44132

133+
attributes #0 = { readonly }
134+
45135
!llvm.module.flags = !{!0, !1}
46136

47137
!0 = !{i32 2, !"Dwarf Version", i32 4}

0 commit comments

Comments
 (0)