[rtsan] Add fork/execve interceptors (#117198)
[llvm-project.git] / llvm / test / Transforms / ObjCARC / contract-replace-arg-use.ll
blob47a88925bdb33a99dc043624c2d5d0bbaf9c96e0
1 ; RUN: opt -passes=objc-arc-contract -S < %s | FileCheck %s
3 declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
4 declare ptr @foo1()
6 ; Check that ARC contraction replaces the function return with the value
7 ; returned by @llvm.objc.autoreleaseReturnValue.
9 ; CHECK-LABEL: define ptr @autoreleaseRVTailCall(
10 ; CHECK: %[[V0:[0-9]+]] = tail call ptr @llvm.objc.autoreleaseReturnValue(
11 ; CHECK: ret ptr %[[V0]]
13 define ptr @autoreleaseRVTailCall() {
14   %1 = call ptr @foo1()
15   %2 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %1)
16   ret ptr %1
19 declare ptr @foo2(i32);
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]]
27 define ptr @autoreleaseRVTailCallPhi(i1 %cond) {
28 entry:
29   br i1 %cond, label %bb1, label %bb2
30 bb1:
31   %v0 = call ptr @foo2(i32 1)
32   br label %bb3
33 bb2:
34   %v2 = call ptr @foo2(i32 2)
35   br label %bb3
36 bb3:
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 %retval