summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/ObjCARC
diff options
context:
space:
mode:
authorPete Cooper <peter_cooper@apple.com>2019-01-03 01:38:08 +0000
committerPete Cooper <peter_cooper@apple.com>2019-01-03 01:38:08 +0000
commit697281df42916d736cc23e74c2a2b2275786c43f (patch)
treeb9ee5c2c9551079578769dc8bf5a081b65cc8df5 /llvm/test/Transforms/ObjCARC
parentddc62017ea18ea08afc6c4b1e5c57198f1222e36 (diff)
downloadbcm5719-llvm-697281df42916d736cc23e74c2a2b2275786c43f.tar.gz
bcm5719-llvm-697281df42916d736cc23e74c2a2b2275786c43f.zip
Teach ObjCARC optimizer about equivalent PHIs when eliminating autoreleaseRV/retainRV pairs
OptimizeAutoreleaseRVCall skips optimizing llvm.objc.autoreleaseReturnValue if it sees a user which is llvm.objc.retainAutoreleasedReturnValue, and if they have equivalent arguments (either identical or equivalent PHIs). It then assumes that ObjCARCOpt::OptimizeRetainRVCall will optimize the pair instead. Trouble is, ObjCARCOpt::OptimizeRetainRVCall doesn't know about equivalent PHIs so optimizes in a different way and we are left with an unoptimized llvm.objc.autoreleaseReturnValue. This teaches ObjCARCOpt::OptimizeRetainRVCall to also understand PHI equivalence. rdar://problem/47005143 Reviewed By: ahatanak Differential Revision: https://reviews.llvm.org/D56235 llvm-svn: 350284
Diffstat (limited to 'llvm/test/Transforms/ObjCARC')
-rw-r--r--llvm/test/Transforms/ObjCARC/rv.ll18
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/test/Transforms/ObjCARC/rv.ll b/llvm/test/Transforms/ObjCARC/rv.ll
index ca3d7e2f848..3d0d56ca0e5 100644
--- a/llvm/test/Transforms/ObjCARC/rv.ll
+++ b/llvm/test/Transforms/ObjCARC/rv.ll
@@ -239,6 +239,24 @@ define i8* @test19(i8* %p) {
ret i8* %p
}
+; Delete autoreleaseRV+retainRV pairs when they have equivalent PHIs as inputs
+
+; CHECK: define i8* @test19phi(i8* %p) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label %test19bb
+; CHECK: test19bb:
+; CHECK-NEXT: ret i8* %p
+define i8* @test19phi(i8* %p) {
+entry:
+ br label %test19bb
+test19bb:
+ %phi1 = phi i8* [ %p, %entry ]
+ %phi2 = phi i8* [ %p, %entry ]
+ call i8* @llvm.objc.autoreleaseReturnValue(i8* %phi1)
+ call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %phi2)
+ ret i8* %p
+}
+
; Like test19 but with plain autorelease.
; CHECK: define i8* @test20(i8* %p) {
OpenPOWER on IntegriCloud