summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanaka@apple.com>2017-08-31 18:27:47 +0000
committerAkira Hatanaka <ahatanaka@apple.com>2017-08-31 18:27:47 +0000
commit13d2beb14d0eceb9421bf3a8f4ea761e6afcef09 (patch)
treedc305ee096c12410153171b735866d3487b9b78f /llvm
parenta6fc06babc7e0b057ee32b17eb350678038c3736 (diff)
downloadbcm5719-llvm-13d2beb14d0eceb9421bf3a8f4ea761e6afcef09.tar.gz
bcm5719-llvm-13d2beb14d0eceb9421bf3a8f4ea761e6afcef09.zip
[ObjCARC] Pass the correct BasicBlock to fix assertion failure.
The BasicBlock passed to FindPredecessorRetainWithSafePath should be the parent block of Autorelease. This fixes a crash that occurs in FindDependencies when StartInst is not in StartBB. rdar://problem/33866381 llvm-svn: 312266
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp3
-rw-r--r--llvm/test/Transforms/ObjCARC/rv.ll19
2 files changed, 21 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp
index 8f3a33f66c7..8c0a90843ef 100644
--- a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp
+++ b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp
@@ -2027,7 +2027,8 @@ void ObjCARCOpt::OptimizeReturns(Function &F) {
continue;
CallInst *Retain = FindPredecessorRetainWithSafePath(
- Arg, &BB, Autorelease, DependingInstructions, Visited, PA);
+ Arg, Autorelease->getParent(), Autorelease, DependingInstructions,
+ Visited, PA);
DependingInstructions.clear();
Visited.clear();
diff --git a/llvm/test/Transforms/ObjCARC/rv.ll b/llvm/test/Transforms/ObjCARC/rv.ll
index e99ba92dc45..d84a875684f 100644
--- a/llvm/test/Transforms/ObjCARC/rv.ll
+++ b/llvm/test/Transforms/ObjCARC/rv.ll
@@ -314,6 +314,25 @@ define void @test25() {
ret void
}
+; Check that ObjCARCOpt::OptimizeReturns removes the redundant calls even when
+; they are not in the same basic block. This code used to cause an assertion
+; failure.
+
+; CHECK-LABEL: define i8* @test26()
+; CHECK: call i8* @returner()
+; CHECK-NOT: call
+define i8* @test26() {
+bb0:
+ %v0 = call i8* @returner()
+ %v1 = tail call i8* @objc_retain(i8* %v0)
+ br label %bb1
+bb1:
+ %v2 = tail call i8* @objc_autoreleaseReturnValue(i8* %v1)
+ br label %bb2
+bb2:
+ ret i8* %v2
+}
+
!0 = !{}
; CHECK: attributes [[NUW]] = { nounwind }
OpenPOWER on IntegriCloud