[ObjC][ARC] Clear the lists of basic blocks and instructions before
authorAkira Hatanaka <ahatanaka@apple.com>
Fri, 13 Nov 2020 02:33:29 +0000 (18:33 -0800)
committerAkira Hatanaka <ahatanaka@apple.com>
Fri, 13 Nov 2020 06:20:02 +0000 (22:20 -0800)
continuing the loop

This fixes a bug introduced in c6f1713c46e61bbb8ece9ac5ac329d02e7f93228.

llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp
llvm/test/Transforms/ObjCARC/rv.ll

index a2dfd1d..1cd7987 100644 (file)
@@ -2358,8 +2358,11 @@ void ObjCARCOpt::OptimizeReturns(Function &F) {
     if (HasSafePathToCall &&
         GetBasicARCInstKind(Retain) == ARCInstKind::RetainRV &&
         GetBasicARCInstKind(Autorelease) == ARCInstKind::AutoreleaseRV &&
-        !cast<CallInst>(*DependingInstructions.begin())->isTailCall())
+        !cast<CallInst>(*DependingInstructions.begin())->isTailCall()) {
+      DependingInstructions.clear();
+      Visited.clear();
       continue;
+    }
 
     DependingInstructions.clear();
     Visited.clear();
index 0a1f466..f89e9f7 100644 (file)
@@ -427,6 +427,31 @@ lpad:
   resume { i8*, i32 } %4
 }
 
+; The second retainRV/autoreleaseRV pair can be removed since the call to
+; @returner is a tail call.
+
+; CHECK-LABEL: define i8* @test30(
+; CHECK: %[[V0:.*]] = call i8* @returner()
+; CHECK-NEXT: call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %[[V0]])
+; CHECK-NEXT: call i8* @llvm.objc.autoreleaseReturnValue(i8* %[[V0]])
+; CHECK-NEXT: ret i8* %[[V0]]
+; CHECK: %[[V3:.*]] = tail call i8* @returner()
+; CHECK-NEXT: ret i8* %[[V3]]
+
+define i8* @test30(i1 %cond) {
+  br i1 %cond, label %bb0, label %bb1
+bb0:
+  %v0 = call i8* @returner()
+  %v1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %v0)
+  %v2 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %v0)
+  ret i8* %v0
+bb1:
+  %v3 = tail call i8* @returner()
+  %v4 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %v3)
+  %v5 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %v3)
+  ret i8* %v3
+}
+
 !0 = !{}
 
 ; CHECK: attributes [[NUW]] = { nounwind }