155 lines · plain
1; RUN: llc -verify-machineinstrs -o - %s | FileCheck %s2; RUN: llc -verify-machineinstrs -global-isel -o - %s | FileCheck %s3 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 ptr @foo0(i32)8declare ptr @foo1()9 10declare void @llvm.objc.release(ptr)11declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)12declare ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr)13 14declare void @foo2(ptr)15 16declare void @foo(i64, i64, i64)17 18define void @rv_marker_ptrauth_blraa(ptr %arg0, i64 %arg1) {19; CHECK-LABEL: rv_marker_ptrauth_blraa20; CHECK: ldr [[ADDR:x[0-9]+]], [21; CHECK-NEXT: blraa [[ADDR]], x122; CHECK-NEXT: mov x29, x2923; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue24;25entry:26 %tmp0 = load ptr, ptr %arg027 %call0 = call ptr %tmp0() [ "ptrauth"(i32 0, i64 %arg1), "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]28 tail call void @foo2(ptr %call0)29 tail call void @llvm.objc.release(ptr %call0)30 ret void31}32 33define void @rv_marker_ptrauth_blraa_unsafeClaim(ptr %arg0, i64 %arg1) {34; CHECK-LABEL: rv_marker_ptrauth_blraa_unsafeClaim35; CHECK: ldr [[ADDR:x[0-9]+]], [36; CHECK-NEXT: blraa [[ADDR]], x137; CHECK-NEXT: mov x29, x2938; CHECK-NEXT: bl objc_unsafeClaimAutoreleasedReturnValue39;40entry:41 %tmp0 = load ptr, ptr %arg042 %call0 = call ptr %tmp0() [ "ptrauth"(i32 0, i64 %arg1), "clang.arc.attachedcall"(ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]43 tail call void @foo2(ptr %call0)44 tail call void @llvm.objc.release(ptr %call0)45 ret void46}47 48define void @rv_marker_ptrauth_blraa_disc_imm16(ptr %arg0) {49; CHECK-LABEL: rv_marker_ptrauth_blraa_disc_imm1650; CHECK: ldr [[ADDR:x[0-9]+]], [51; CHECK-NEXT: mov x17, #4543152; CHECK-NEXT: blrab [[ADDR]], x1753; CHECK-NEXT: mov x29, x2954; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue55;56 %tmp0 = load ptr, ptr %arg057 %call0 = call ptr %tmp0() [ "ptrauth"(i32 1, i64 45431), "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]58 tail call void @foo2(ptr %call0)59 tail call void @llvm.objc.release(ptr %call0)60 ret void61}62 63define void @rv_marker_ptrauth_blraa_multiarg(ptr %arg0, i64 %arg1, i64 %a, i64 %b, i64 %c) {64; CHECK-LABEL: rv_marker_ptrauth_blraa_multiarg65; CHECK: mov [[TMP:x[0-9]+]], x166; CHECK-DAG: ldr [[ADDR:x[0-9]+]]67; CHECK-DAG: mov x0, x468; CHECK-DAG: mov x1, x369; CHECK-NEXT: blraa [[ADDR]], [[TMP]]70; CHECK-NEXT: mov x29, x2971; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue72;73entry:74 %tmp0 = load ptr, ptr %arg075 %call0 = call ptr %tmp0(i64 %c, i64 %b, i64 %a) [ "ptrauth"(i32 0, i64 %arg1), "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]76 tail call void @foo2(ptr %call0)77 tail call void @llvm.objc.release(ptr %call0)78 ret void79}80 81define void @rv_marker_ptrauth_blrab(ptr %arg0, i64 %arg1) {82; CHECK-LABEL: rv_marker_ptrauth_blrab83; CHECK: ldr [[ADDR:x[0-9]+]], [84; CHECK-NEXT: blrab [[ADDR]], x185; CHECK-NEXT: mov x29, x2986; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue87;88 %tmp0 = load ptr, ptr %arg089 %call0 = call ptr %tmp0() [ "ptrauth"(i32 1, i64 %arg1), "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]90 tail call void @foo2(ptr %call0)91 tail call void @llvm.objc.release(ptr %call0)92 ret void93}94 95define void @rv_marker_ptrauth_blrab_disc_imm16(ptr %arg0) {96; CHECK-LABEL: rv_marker_ptrauth_blrab_disc_imm1697; CHECK: ldr [[ADDR:x[0-9]+]], [98; CHECK-NEXT: mov x17, #25699; CHECK-NEXT: blrab [[ADDR]], x17100; CHECK-NEXT: mov x29, x29101; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue102;103 %tmp0 = load ptr, ptr %arg0104 %call0 = call ptr %tmp0() [ "ptrauth"(i32 1, i64 256), "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]105 tail call void @foo2(ptr %call0)106 tail call void @llvm.objc.release(ptr %call0)107 ret void108}109 110define void @rv_marker_ptrauth_blraaz(ptr %arg0) {111; CHECK-LABEL: rv_marker_ptrauth_blraaz112; CHECK: ldr [[ADDR:x[0-9]+]], [113; CHECK-NEXT: blraaz [[ADDR]]114; CHECK-NEXT: mov x29, x29115; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue116;117 %tmp0 = load ptr, ptr %arg0118 %call0 = call ptr %tmp0() [ "ptrauth"(i32 0, i64 0), "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]119 tail call void @foo2(ptr %call0)120 tail call void @llvm.objc.release(ptr %call0)121 ret void122}123 124define void @rv_marker_ptrauth_blrabz(ptr %arg0) {125; CHECK-LABEL: rv_marker_ptrauth_blrabz126; CHECK: ldr [[ADDR:x[0-9]+]], [127; CHECK-NEXT: blrabz [[ADDR]]128; CHECK-NEXT: mov x29, x29129; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue130;131 %tmp0 = load ptr, ptr %arg0132 %call0 = call ptr %tmp0() [ "ptrauth"(i32 1, i64 0), "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]133 tail call void @foo2(ptr %call0)134 tail call void @llvm.objc.release(ptr %call0)135 ret void136}137 138define void @rv_marker_ptrauth_blrabz_multiarg(ptr %arg0, i64 %a, i64 %b, i64 %c) {139; CHECK-LABEL: rv_marker_ptrauth_blrabz_multiarg140; CHECK: mov [[TMP:x[0-9]+]], x1141; CHECK-DAG: ldr [[ADDR:x[0-9]+]], [142; CHECK-DAG: mov x0, x3143; CHECK-DAG: mov x1, x2144; CHECK-DAG: mov x2, [[TMP]]145; CHECK-NEXT: blrabz [[ADDR]]146; CHECK-NEXT: mov x29, x29147; CHECK-NEXT: bl objc_retainAutoreleasedReturnValue148;149 %tmp0 = load ptr, ptr %arg0150 %call0 = call ptr %tmp0(i64 %c, i64 %b, i64 %a) [ "ptrauth"(i32 1, i64 0), "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]151 tail call void @foo2(ptr %call0)152 tail call void @llvm.objc.release(ptr %call0)153 ret void154}155