1; RUN: llc -verify-machineinstrs -o - %s | FileCheck %s 2; RUN: llc -verify-machineinstrs -global-isel -o - %s | FileCheck %s 3 4target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 5target triple = "arm64e-apple-iphoneos" 6 7declare i8* @foo0(i32) 8declare i8* @foo1() 9 10declare void @llvm.objc.release(i8*) 11declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*) 12declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*) 13 14declare void @foo2(i8*) 15 16declare void @foo(i64, i64, i64) 17 18define void @rv_marker_ptrauth_blraa(i8* ()** %arg0, i64 %arg1) { 19; CHECK-LABEL: rv_marker_ptrauth_blraa 20; CHECK: ldr [[ADDR:x[0-9]+]], [ 21; CHECK-NEXT: blraa [[ADDR]], x1 22; CHECK-NEXT: mov x29, x29 23; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue 24; 25entry: 26 %tmp0 = load i8* ()*, i8* ()** %arg0 27 %call0 = call i8* %tmp0() [ "ptrauth"(i32 0, i64 %arg1), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ] 28 tail call void @foo2(i8* %call0) 29 tail call void @llvm.objc.release(i8* %call0) 30 ret void 31} 32 33define void @rv_marker_ptrauth_blraa_unsafeClaim(i8* ()** %arg0, i64 %arg1) { 34; CHECK-LABEL: rv_marker_ptrauth_blraa_unsafeClaim 35; CHECK: ldr [[ADDR:x[0-9]+]], [ 36; CHECK-NEXT: blraa [[ADDR]], x1 37; CHECK-NEXT: mov x29, x29 38; CHECK-NEXT: bl objc_unsafeClaimAutoreleasedReturnValue 39; 40entry: 41 %tmp0 = load i8* ()*, i8* ()** %arg0 42 %call0 = call i8* %tmp0() [ "ptrauth"(i32 0, i64 %arg1), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.unsafeClaimAutoreleasedReturnValue) ] 43 tail call void @foo2(i8* %call0) 44 tail call void @llvm.objc.release(i8* %call0) 45 ret void 46} 47 48define void @rv_marker_ptrauth_blraa_disc_imm16(i8* ()** %arg0) { 49; CHECK-LABEL: rv_marker_ptrauth_blraa_disc_imm16 50; CHECK: ldr [[ADDR:x[0-9]+]], [ 51; CHECK-NEXT: mov x17, #45431 52; CHECK-NEXT: blrab [[ADDR]], x17 53; CHECK-NEXT: mov x29, x29 54; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue 55; 56 %tmp0 = load i8* ()*, i8* ()** %arg0 57 %call0 = call i8* %tmp0() [ "ptrauth"(i32 1, i64 45431), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ] 58 tail call void @foo2(i8* %call0) 59 tail call void @llvm.objc.release(i8* %call0) 60 ret void 61} 62 63define void @rv_marker_ptrauth_blraa_multiarg(i8* (i64, i64, i64)** %arg0, i64 %arg1, i64 %a, i64 %b, i64 %c) { 64; CHECK-LABEL: rv_marker_ptrauth_blraa_multiarg 65; CHECK: mov [[TMP:x[0-9]+]], x1 66; CHECK-DAG: ldr [[ADDR:x[0-9]+]] 67; CHECK-DAG: mov x0, x4 68; CHECK-DAG: mov x1, x3 69; CHECK-NEXT: blraa [[ADDR]], [[TMP]] 70; CHECK-NEXT: mov x29, x29 71; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue 72; 73entry: 74 %tmp0 = load i8* (i64, i64, i64)*, i8* (i64, i64, i64)** %arg0 75 %call0 = call i8* %tmp0(i64 %c, i64 %b, i64 %a) [ "ptrauth"(i32 0, i64 %arg1), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ] 76 tail call void @foo2(i8* %call0) 77 tail call void @llvm.objc.release(i8* %call0) 78 ret void 79} 80 81define void @rv_marker_ptrauth_blrab(i8* ()** %arg0, i64 %arg1) { 82; CHECK-LABEL: rv_marker_ptrauth_blrab 83; CHECK: ldr [[ADDR:x[0-9]+]], [ 84; CHECK-NEXT: blrab [[ADDR]], x1 85; CHECK-NEXT: mov x29, x29 86; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue 87; 88 %tmp0 = load i8* ()*, i8* ()** %arg0 89 %call0 = call i8* %tmp0() [ "ptrauth"(i32 1, i64 %arg1), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ] 90 tail call void @foo2(i8* %call0) 91 tail call void @llvm.objc.release(i8* %call0) 92 ret void 93} 94 95define void @rv_marker_ptrauth_blrab_disc_imm16(i8* ()** %arg0) { 96; CHECK-LABEL: rv_marker_ptrauth_blrab_disc_imm16 97; CHECK: ldr [[ADDR:x[0-9]+]], [ 98; CHECK-NEXT: mov x17, #256 99; CHECK-NEXT: blrab [[ADDR]], x17 100; CHECK-NEXT: mov x29, x29 101; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue 102; 103 %tmp0 = load i8* ()*, i8* ()** %arg0 104 %call0 = call i8* %tmp0() [ "ptrauth"(i32 1, i64 256), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ] 105 tail call void @foo2(i8* %call0) 106 tail call void @llvm.objc.release(i8* %call0) 107 ret void 108} 109 110define void @rv_marker_ptrauth_blraaz(i8* ()** %arg0) { 111; CHECK-LABEL: rv_marker_ptrauth_blraaz 112; CHECK: ldr [[ADDR:x[0-9]+]], [ 113; CHECK-NEXT: blraaz [[ADDR]] 114; CHECK-NEXT: mov x29, x29 115; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue 116; 117 %tmp0 = load i8* ()*, i8* ()** %arg0 118 %call0 = call i8* %tmp0() [ "ptrauth"(i32 0, i64 0), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ] 119 tail call void @foo2(i8* %call0) 120 tail call void @llvm.objc.release(i8* %call0) 121 ret void 122} 123 124define void @rv_marker_ptrauth_blrabz(i8* ()** %arg0) { 125; CHECK-LABEL: rv_marker_ptrauth_blrabz 126; CHECK: ldr [[ADDR:x[0-9]+]], [ 127; CHECK-NEXT: blrabz [[ADDR]] 128; CHECK-NEXT: mov x29, x29 129; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue 130; 131 %tmp0 = load i8* ()*, i8* ()** %arg0 132 %call0 = call i8* %tmp0() [ "ptrauth"(i32 1, i64 0), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ] 133 tail call void @foo2(i8* %call0) 134 tail call void @llvm.objc.release(i8* %call0) 135 ret void 136} 137 138define void @rv_marker_ptrauth_blrabz_multiarg(i8* (i64, i64, i64)** %arg0, i64 %a, i64 %b, i64 %c) { 139; CHECK-LABEL: rv_marker_ptrauth_blrabz_multiarg 140; CHECK: mov [[TMP:x[0-9]+]], x1 141; CHECK-DAG: ldr [[ADDR:x[0-9]+]], [ 142; CHECK-DAG: mov x0, x3 143; CHECK-DAG: mov x1, x2 144; CHECK-DAG: mov x2, [[TMP]] 145; CHECK-NEXT: blrabz [[ADDR]] 146; CHECK-NEXT: mov x29, x29 147; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue 148; 149 %tmp0 = load i8* (i64, i64, i64)*, i8* (i64, i64, i64)** %arg0 150 %call0 = call i8* %tmp0(i64 %c, i64 %b, i64 %a) [ "ptrauth"(i32 1, i64 0), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ] 151 tail call void @foo2(i8* %call0) 152 tail call void @llvm.objc.release(i8* %call0) 153 ret void 154} 155