42 lines · plain
1; RUN: opt -passes=objc-arc-contract -S < %s | FileCheck %s2 3declare ptr @llvm.objc.autoreleaseReturnValue(ptr)4declare ptr @foo1()5 6; Check that ARC contraction replaces the function return with the value7; returned by @llvm.objc.autoreleaseReturnValue.8 9; CHECK-LABEL: define ptr @autoreleaseRVTailCall(10; CHECK: %[[V0:[0-9]+]] = tail call ptr @llvm.objc.autoreleaseReturnValue(11; CHECK: ret ptr %[[V0]]12 13define ptr @autoreleaseRVTailCall() {14 %1 = call ptr @foo1()15 %2 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %1)16 ret ptr %117}18 19declare ptr @foo2(i32);20 21; CHECK-LABEL: define ptr @autoreleaseRVTailCallPhi(22; CHECK: %[[PHIVAL:.*]] = phi ptr [ %{{.*}}, %bb1 ], [ %{{.*}}, %bb2 ]23; CHECK: %[[RETVAL:.*]] = phi ptr [ %{{.*}}, %bb1 ], [ %{{.*}}, %bb2 ]24; CHECK: %[[V4:.*]] = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %[[PHIVAL]])25; CHECK: ret ptr %[[V4]]26 27define ptr @autoreleaseRVTailCallPhi(i1 %cond) {28entry:29 br i1 %cond, label %bb1, label %bb230bb1:31 %v0 = call ptr @foo2(i32 1)32 br label %bb333bb2:34 %v2 = call ptr @foo2(i32 2)35 br label %bb336bb3:37 %phival = phi ptr [ %v0, %bb1 ], [ %v2, %bb2 ]38 %retval = phi ptr [ %v0, %bb1 ], [ %v2, %bb2 ]39 %v4 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %phival)40 ret ptr %retval41}42