@@ -126,6 +126,62 @@ join:
126
126
ret void
127
127
}
128
128
129
+ ; In this test, insertion points for the retain and release calls that could be
130
+ ; eliminated are in different blocks (bb1 and if.then).
131
+
132
+ define void @test5 (i8* %obj , i1 %cond0 , i1 %cond1 ) {
133
+ ; CHECK-LABEL: @test5(
134
+ ; CHECK-NEXT: br i1 [[COND0:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
135
+ ; CHECK: if.then:
136
+ ; CHECK-NEXT: call void @readOnlyFunc(i8* [[OBJ:%.*]], i8* null)
137
+ ; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ]])
138
+ ; CHECK-NEXT: br i1 [[COND1:%.*]], label [[IF_THEN2:%.*]], label [[IF_ELSE2:%.*]]
139
+ ; CHECK: if.then2:
140
+ ; CHECK-NEXT: br label [[BB1:%.*]]
141
+ ; CHECK: if.else2:
142
+ ; CHECK-NEXT: br label [[BB1]]
143
+ ; CHECK: bb1:
144
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 1, 2
145
+ ; CHECK-NEXT: [[TMP2:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ]])
146
+ ; CHECK-NEXT: call void @alterRefCount()
147
+ ; CHECK-NEXT: br label [[JOIN:%.*]]
148
+ ; CHECK: if.else:
149
+ ; CHECK-NEXT: [[TMP3:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ]])
150
+ ; CHECK-NEXT: call void @alterRefCount()
151
+ ; CHECK-NEXT: call void @use(i8* [[OBJ]])
152
+ ; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ]])
153
+ ; CHECK-NEXT: br label [[JOIN]]
154
+ ; CHECK: join:
155
+ ; CHECK-NEXT: ret void
156
+ ;
157
+ %v0 = call i8* @llvm.objc.retain (i8* %obj )
158
+ br i1 %cond0 , label %if.then , label %if.else
159
+
160
+ if.then:
161
+ call void @readOnlyFunc (i8* %obj , i8* null ) #0
162
+ br i1 %cond1 , label %if.then2 , label %if.else2
163
+
164
+ if.then2:
165
+ br label %bb1
166
+
167
+ if.else2:
168
+ br label %bb1
169
+
170
+ bb1:
171
+ add i32 1 , 2
172
+ call void @alterRefCount ()
173
+ br label %join
174
+
175
+ if.else:
176
+ call void @alterRefCount ()
177
+ call void @use (i8* %obj )
178
+ br label %join
179
+
180
+ join:
181
+ call void @llvm.objc.release (i8* %obj ), !clang.imprecise_release !9
182
+ ret void
183
+ }
184
+
129
185
declare void @llvm.dbg.declare (metadata , metadata , metadata )
130
186
declare i8* @llvm.objc.retain (i8* ) local_unnamed_addr
131
187
declare void @llvm.objc.release (i8* ) local_unnamed_addr
0 commit comments