[llvm] 76dd98e - Precommit test cases in https://reviews.llvm.org/D104953
Akira Hatanaka via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 1 17:03:55 PDT 2021
Author: Akira Hatanaka
Date: 2021-07-01T17:03:07-07:00
New Revision: 76dd98ec75ce70c1a2012e543e50709d646a6d8d
URL: https://github.com/llvm/llvm-project/commit/76dd98ec75ce70c1a2012e543e50709d646a6d8d
DIFF: https://github.com/llvm/llvm-project/commit/76dd98ec75ce70c1a2012e543e50709d646a6d8d.diff
LOG: Precommit test cases in https://reviews.llvm.org/D104953
Added:
Modified:
llvm/test/Transforms/ObjCARC/code-motion.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/ObjCARC/code-motion.ll b/llvm/test/Transforms/ObjCARC/code-motion.ll
index 7f254e6980463..305a27c203c27 100644
--- a/llvm/test/Transforms/ObjCARC/code-motion.ll
+++ b/llvm/test/Transforms/ObjCARC/code-motion.ll
@@ -2,6 +2,7 @@
declare void @alterRefCount()
declare void @use(i8*)
+declare void @readOnlyFunc(i8*, i8*)
@g0 = global i8* null, align 8
@@ -38,10 +39,99 @@ define void @test2() {
ret void
}
+; ARC optimizer shouldn't reverse the order of retains and releases in
+; if.then in @test3 and @test4.
+
+define void @test3(i8* %obj, i1 %cond) {
+; CHECK-LABEL: @test3(
+; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
+; CHECK: if.then:
+; CHECK-NEXT: call void @readOnlyFunc(i8* [[OBJ:%.*]], i8* null)
+; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ]]) {{.*}}, !clang.imprecise_release !2
+; CHECK-NEXT: [[TMP1:%.*]] = add i32 1, 2
+; CHECK-NEXT: [[TMP2:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ]])
+; CHECK-NEXT: call void @alterRefCount()
+; CHECK-NEXT: br label [[JOIN:%.*]]
+; CHECK: if.else:
+; CHECK-NEXT: [[TMP3:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ]])
+; CHECK-NEXT: call void @alterRefCount()
+; CHECK-NEXT: call void @use(i8* [[OBJ]])
+; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ]]) {{.*}}, !clang.imprecise_release !2
+; CHECK-NEXT: br label [[JOIN]]
+; CHECK: join:
+; CHECK-NEXT: ret void
+;
+ %v0 = call i8* @llvm.objc.retain(i8* %obj)
+ br i1 %cond, label %if.then, label %if.else
+
+if.then:
+ call void @readOnlyFunc(i8* %obj, i8* null) #0
+ add i32 1, 2
+ call void @alterRefCount()
+ br label %join
+
+if.else:
+ call void @alterRefCount()
+ call void @use(i8* %obj)
+ br label %join
+
+join:
+ call void @llvm.objc.release(i8* %obj), !clang.imprecise_release !9
+ ret void
+}
+
+define void @test4(i8* %obj0, i8* %obj1, i1 %cond) {
+; CHECK-LABEL: @test4(
+; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
+; CHECK: if.then:
+; CHECK-NEXT: call void @readOnlyFunc(i8* [[OBJ0:%.*]], i8* [[OBJ1:%.*]])
+; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ1]]) {{.*}}, !clang.imprecise_release !2
+; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ0]]) {{.*}}, !clang.imprecise_release !2
+; CHECK-NEXT: [[TMP1:%.*]] = add i32 1, 2
+; CHECK-NEXT: [[TMP2:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ1]])
+; CHECK-NEXT: [[TMP3:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ0]])
+; CHECK-NEXT: call void @alterRefCount()
+; CHECK-NEXT: br label [[JOIN:%.*]]
+; CHECK: if.else:
+; CHECK-NEXT: [[TMP4:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ1]])
+; CHECK-NEXT: [[TMP5:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ0]])
+; CHECK-NEXT: call void @alterRefCount()
+; CHECK-NEXT: call void @use(i8* [[OBJ0]])
+; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ0]]) {{.*}}, !clang.imprecise_release !2
+; CHECK-NEXT: call void @use(i8* [[OBJ1]])
+; CHECK-NEXT: call void @llvm.objc.release(i8* [[OBJ1]]) {{.*}}, !clang.imprecise_release !2
+; CHECK-NEXT: br label [[JOIN]]
+; CHECK: join:
+; CHECK-NEXT: ret void
+;
+ %v0 = call i8* @llvm.objc.retain(i8* %obj0)
+ %v1 = call i8* @llvm.objc.retain(i8* %obj1)
+ br i1 %cond, label %if.then, label %if.else
+
+if.then:
+ call void @readOnlyFunc(i8* %obj0, i8* %obj1) #0
+ add i32 1, 2
+ call void @alterRefCount()
+ br label %join
+
+if.else:
+ call void @alterRefCount()
+ call void @use(i8* %obj0)
+ call void @use(i8* %obj1)
+ br label %join
+
+join:
+ call void @llvm.objc.release(i8* %obj0), !clang.imprecise_release !9
+ call void @llvm.objc.release(i8* %obj1), !clang.imprecise_release !9
+ ret void
+}
+
declare void @llvm.dbg.declare(metadata, metadata, metadata)
declare i8* @llvm.objc.retain(i8*) local_unnamed_addr
declare void @llvm.objc.release(i8*) local_unnamed_addr
+attributes #0 = { readonly }
+
!llvm.module.flags = !{!0, !1}
!0 = !{i32 2, !"Dwarf Version", i32 4}
More information about the llvm-commits
mailing list