; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel=0 -verify-machineinstrs \ ; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL="L" --check-prefix=UNCHECKED ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel -global-isel-abort=1 -verify-machineinstrs \ ; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL="L" --check-prefix=UNCHECKED ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel=0 -verify-machineinstrs \ ; RUN: | FileCheck %s -DL="L" --check-prefix=CHECKED ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel -global-isel-abort=1 -verify-machineinstrs \ ; RUN: | FileCheck %s -DL="L" --check-prefix=CHECKED ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel=0 -verify-machineinstrs \ ; RUN: -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL="L" --check-prefix=TRAP ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel -global-isel-abort=1 -verify-machineinstrs \ ; RUN: -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL="L" --check-prefix=TRAP ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel=0 -verify-machineinstrs \ ; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL=".L" --check-prefix=UNCHECKED ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel -global-isel-abort=1 -verify-machineinstrs \ ; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL=".L" --check-prefix=UNCHECKED ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel=0 -verify-machineinstrs \ ; RUN: | FileCheck %s -DL=".L" --check-prefix=CHECKED ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel -global-isel-abort=1 -verify-machineinstrs \ ; RUN: | FileCheck %s -DL=".L" --check-prefix=CHECKED ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel=0 -verify-machineinstrs \ ; RUN: -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL=".L" --check-prefix=TRAP ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel -global-isel-abort=1 -verify-machineinstrs \ ; RUN: -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL=".L" --check-prefix=TRAP target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" define i64 @test_resign_load_relative_ia_ia(i64 %arg, i64 %arg1, i64 %arg2) { ; UNCHECKED-LABEL: test_resign_load_relative_ia_ia: ; UNCHECKED: %bb.0: ; UNCHECKED-NEXT: mov x16, x0 ; UNCHECKED-NEXT: autia x16, x1 ; UNCHECKED-NEXT: ldrsw x17, [x16, #-256]! ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: pacia x16, x2 ; UNCHECKED-NEXT: mov x0, x16 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_resign_load_relative_ia_ia: ; CHECKED: %bb.0: ; CHECKED-NEXT: mov x16, x0 ; CHECKED-NEXT: autia x16, x1 ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpaci x17 ; CHECKED-NEXT: cmp x16, x17 ; CHECKED-NEXT: b.eq [[L]]auth_success_0 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_0 ; CHECKED-NEXT: Lauth_success_0: ; CHECKED-NEXT: ldrsw x17, [x16, #-256]! ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: pacia x16, x2 ; CHECKED-NEXT: Lresign_end_0: ; CHECKED-NEXT: mov x0, x16 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_resign_load_relative_ia_ia: ; TRAP: %bb.0: ; TRAP-NEXT: mov x16, x0 ; TRAP-NEXT: autia x16, x1 ; TRAP-NEXT: mov x17, x16 ; TRAP-NEXT: xpaci x17 ; TRAP-NEXT: cmp x16, x17 ; TRAP-NEXT: b.eq [[L]]auth_success_0 ; TRAP-NEXT: brk #0xc470 ; TRAP-NEXT: Lauth_success_0: ; TRAP-NEXT: ldrsw x17, [x16, #-256]! ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: pacia x16, x2 ; TRAP-NEXT: mov x0, x16 ; TRAP-NEXT: ret %tmp = call i64 @llvm.ptrauth.resign.load.relative(i64 %arg, i32 0, i64 %arg1, i32 0, i64 %arg2, i64 -256) ret i64 %tmp } ; note: offset 256 is larger tha 255 (largest simm9), is uint<24> define i64 @test_resign_load_relative_ib_ia(i64 %arg, i64 %arg1, i64 %arg2) { ; UNCHECKED-LABEL: test_resign_load_relative_ib_ia: ; UNCHECKED: %bb.0: ; UNCHECKED-NEXT: mov x16, x0 ; UNCHECKED-NEXT: autib x16, x1 ; UNCHECKED-NEXT: add x16, x16, #256 ; UNCHECKED-NEXT: ldrsw x17, [x16] ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: pacia x16, x2 ; UNCHECKED-NEXT: mov x0, x16 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_resign_load_relative_ib_ia: ; CHECKED: %bb.0: ; CHECKED-NEXT: mov x16, x0 ; CHECKED-NEXT: autib x16, x1 ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpaci x17 ; CHECKED-NEXT: cmp x16, x17 ; CHECKED-NEXT: b.eq [[L]]auth_success_1 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_1 ; CHECKED-NEXT: Lauth_success_1: ; CHECKED-NEXT: add x16, x16, #256 ; CHECKED-NEXT: ldrsw x17, [x16] ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: pacia x16, x2 ; CHECKED-NEXT: Lresign_end_1: ; CHECKED-NEXT: mov x0, x16 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_resign_load_relative_ib_ia: ; TRAP: %bb.0: ; TRAP-NEXT: mov x16, x0 ; TRAP-NEXT: autib x16, x1 ; TRAP-NEXT: mov x17, x16 ; TRAP-NEXT: xpaci x17 ; TRAP-NEXT: cmp x16, x17 ; TRAP-NEXT: b.eq [[L]]auth_success_1 ; TRAP-NEXT: brk #0xc471 ; TRAP-NEXT: Lauth_success_1: ; TRAP-NEXT: add x16, x16, #256 ; TRAP-NEXT: ldrsw x17, [x16] ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: pacia x16, x2 ; TRAP-NEXT: mov x0, x16 ; TRAP-NEXT: ret %tmp = call i64 @llvm.ptrauth.resign.load.relative(i64 %arg, i32 1, i64 %arg1, i32 0, i64 %arg2, i64 256) ret i64 %tmp } define i64 @test_resign_load_relative_da_ia(i64 %arg, i64 %arg1, i64 %arg2) { ; UNCHECKED-LABEL: test_resign_load_relative_da_ia: ; UNCHECKED: %bb.0: ; UNCHECKED-NEXT: mov x16, x0 ; UNCHECKED-NEXT: autda x16, x1 ; UNCHECKED-NEXT: add x16, x16, #256 ; UNCHECKED-NEXT: ldrsw x17, [x16] ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: pacia x16, x2 ; UNCHECKED-NEXT: mov x0, x16 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_resign_load_relative_da_ia: ; CHECKED: %bb.0: ; CHECKED-NEXT: mov x16, x0 ; CHECKED-NEXT: autda x16, x1 ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 ; CHECKED-NEXT: b.eq [[L]]auth_success_2 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_2 ; CHECKED-NEXT: Lauth_success_2: ; CHECKED-NEXT: add x16, x16, #256 ; CHECKED-NEXT: ldrsw x17, [x16] ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: pacia x16, x2 ; CHECKED-NEXT: Lresign_end_2: ; CHECKED-NEXT: mov x0, x16 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_resign_load_relative_da_ia: ; TRAP: %bb.0: ; TRAP-NEXT: mov x16, x0 ; TRAP-NEXT: autda x16, x1 ; TRAP-NEXT: mov x17, x16 ; TRAP-NEXT: xpacd x17 ; TRAP-NEXT: cmp x16, x17 ; TRAP-NEXT: b.eq [[L]]auth_success_2 ; TRAP-NEXT: brk #0xc472 ; TRAP-NEXT: Lauth_success_2: ; TRAP-NEXT: add x16, x16, #256 ; TRAP-NEXT: ldrsw x17, [x16] ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: pacia x16, x2 ; TRAP-NEXT: mov x0, x16 ; TRAP-NEXT: ret %tmp = call i64 @llvm.ptrauth.resign.load.relative(i64 %arg, i32 2, i64 %arg1, i32 0, i64 %arg2, i64 256) ret i64 %tmp } define i64 @test_resign_load_relative_db_da(i64 %arg, i64 %arg1, i64 %arg2) { ; UNCHECKED-LABEL: test_resign_load_relative_db_da: ; UNCHECKED: %bb.0: ; UNCHECKED-NEXT: mov x16, x0 ; UNCHECKED-NEXT: autdb x16, x1 ; UNCHECKED-NEXT: add x16, x16, #256 ; UNCHECKED-NEXT: ldrsw x17, [x16] ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: pacda x16, x2 ; UNCHECKED-NEXT: mov x0, x16 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_resign_load_relative_db_da: ; CHECKED: %bb.0: ; CHECKED-NEXT: mov x16, x0 ; CHECKED-NEXT: autdb x16, x1 ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 ; CHECKED-NEXT: b.eq [[L]]auth_success_3 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_3 ; CHECKED-NEXT: Lauth_success_3: ; CHECKED-NEXT: add x16, x16, #256 ; CHECKED-NEXT: ldrsw x17, [x16] ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: pacda x16, x2 ; CHECKED-NEXT: Lresign_end_3: ; CHECKED-NEXT: mov x0, x16 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_resign_load_relative_db_da: ; TRAP: %bb.0: ; TRAP-NEXT: mov x16, x0 ; TRAP-NEXT: autdb x16, x1 ; TRAP-NEXT: mov x17, x16 ; TRAP-NEXT: xpacd x17 ; TRAP-NEXT: cmp x16, x17 ; TRAP-NEXT: b.eq [[L]]auth_success_3 ; TRAP-NEXT: brk #0xc473 ; TRAP-NEXT: Lauth_success_3: ; TRAP-NEXT: add x16, x16, #256 ; TRAP-NEXT: ldrsw x17, [x16] ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: pacda x16, x2 ; TRAP-NEXT: mov x0, x16 ; TRAP-NEXT: ret %tmp = call i64 @llvm.ptrauth.resign.load.relative(i64 %arg, i32 3, i64 %arg1, i32 2, i64 %arg2, i64 256) ret i64 %tmp } define i64 @test_resign_load_relative_iza_db(i64 %arg, i64 %arg1, i64 %arg2) { ; UNCHECKED-LABEL: test_resign_load_relative_iza_db: ; UNCHECKED: %bb.0: ; UNCHECKED-NEXT: mov x16, x0 ; UNCHECKED-NEXT: autiza x16 ; UNCHECKED-NEXT: add x16, x16, #256 ; UNCHECKED-NEXT: ldrsw x17, [x16] ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: pacdb x16, x2 ; UNCHECKED-NEXT: mov x0, x16 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_resign_load_relative_iza_db: ; CHECKED: %bb.0: ; CHECKED-NEXT: mov x16, x0 ; CHECKED-NEXT: autiza x16 ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpaci x17 ; CHECKED-NEXT: cmp x16, x17 ; CHECKED-NEXT: b.eq [[L]]auth_success_4 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_4 ; CHECKED-NEXT: Lauth_success_4: ; CHECKED-NEXT: add x16, x16, #256 ; CHECKED-NEXT: ldrsw x17, [x16] ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: pacdb x16, x2 ; CHECKED-NEXT: Lresign_end_4: ; CHECKED-NEXT: mov x0, x16 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_resign_load_relative_iza_db: ; TRAP: %bb.0: ; TRAP-NEXT: mov x16, x0 ; TRAP-NEXT: autiza x16 ; TRAP-NEXT: mov x17, x16 ; TRAP-NEXT: xpaci x17 ; TRAP-NEXT: cmp x16, x17 ; TRAP-NEXT: b.eq [[L]]auth_success_4 ; TRAP-NEXT: brk #0xc470 ; TRAP-NEXT: Lauth_success_4: ; TRAP-NEXT: add x16, x16, #256 ; TRAP-NEXT: ldrsw x17, [x16] ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: pacdb x16, x2 ; TRAP-NEXT: mov x0, x16 ; TRAP-NEXT: ret %tmp = call i64 @llvm.ptrauth.resign.load.relative(i64 %arg, i32 0, i64 0, i32 3, i64 %arg2, i64 256) ret i64 %tmp } define i64 @test_resign_load_relative_da_dzb(i64 %arg, i64 %arg1, i64 %arg2) { ; UNCHECKED-LABEL: test_resign_load_relative_da_dzb: ; UNCHECKED: %bb.0: ; UNCHECKED-NEXT: mov x16, x0 ; UNCHECKED-NEXT: autda x16, x1 ; UNCHECKED-NEXT: add x16, x16, #256 ; UNCHECKED-NEXT: ldrsw x17, [x16] ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: pacdzb x16 ; UNCHECKED-NEXT: mov x0, x16 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_resign_load_relative_da_dzb: ; CHECKED: %bb.0: ; CHECKED-NEXT: mov x16, x0 ; CHECKED-NEXT: autda x16, x1 ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 ; CHECKED-NEXT: b.eq [[L]]auth_success_5 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_5 ; CHECKED-NEXT: Lauth_success_5: ; CHECKED-NEXT: add x16, x16, #256 ; CHECKED-NEXT: ldrsw x17, [x16] ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: pacdzb x16 ; CHECKED-NEXT: Lresign_end_5: ; CHECKED-NEXT: mov x0, x16 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_resign_load_relative_da_dzb: ; TRAP: %bb.0: ; TRAP-NEXT: mov x16, x0 ; TRAP-NEXT: autda x16, x1 ; TRAP-NEXT: mov x17, x16 ; TRAP-NEXT: xpacd x17 ; TRAP-NEXT: cmp x16, x17 ; TRAP-NEXT: b.eq [[L]]auth_success_5 ; TRAP-NEXT: brk #0xc472 ; TRAP-NEXT: Lauth_success_5: ; TRAP-NEXT: add x16, x16, #256 ; TRAP-NEXT: ldrsw x17, [x16] ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: pacdzb x16 ; TRAP-NEXT: mov x0, x16 ; TRAP-NEXT: ret %tmp = call i64 @llvm.ptrauth.resign.load.relative(i64 %arg, i32 2, i64 %arg1, i32 3, i64 0,i64 256) ret i64 %tmp } define i64 @test_resign_load_relative_da_constdisc(i64 %arg, i64 %arg1) { ; UNCHECKED-LABEL: test_resign_load_relative_da_constdisc: ; UNCHECKED: %bb.0: ; UNCHECKED-NEXT: mov x16, x0 ; UNCHECKED-NEXT: autda x16, x1 ; UNCHECKED-NEXT: add x16, x16, #256 ; UNCHECKED-NEXT: ldrsw x17, [x16] ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: mov x17, #256 ; UNCHECKED-NEXT: pacda x16, x17 ; UNCHECKED-NEXT: mov x0, x16 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_resign_load_relative_da_constdisc: ; CHECKED: %bb.0: ; CHECKED-NEXT: mov x16, x0 ; CHECKED-NEXT: autda x16, x1 ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 ; CHECKED-NEXT: b.eq [[L]]auth_success_6 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_6 ; CHECKED-NEXT: Lauth_success_6: ; CHECKED-NEXT: add x16, x16, #256 ; CHECKED-NEXT: ldrsw x17, [x16] ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: mov x17, #256 ; CHECKED-NEXT: pacda x16, x17 ; CHECKED-NEXT: Lresign_end_6: ; CHECKED-NEXT: mov x0, x16 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_resign_load_relative_da_constdisc: ; TRAP: %bb.0: ; TRAP-NEXT: mov x16, x0 ; TRAP-NEXT: autda x16, x1 ; TRAP-NEXT: mov x17, x16 ; TRAP-NEXT: xpacd x17 ; TRAP-NEXT: cmp x16, x17 ; TRAP-NEXT: b.eq [[L]]auth_success_6 ; TRAP-NEXT: brk #0xc472 ; TRAP-NEXT: Lauth_success_6: ; TRAP-NEXT: add x16, x16, #256 ; TRAP-NEXT: ldrsw x17, [x16] ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: mov x17, #256 ; TRAP-NEXT: pacda x16, x17 ; TRAP-NEXT: mov x0, x16 ; TRAP-NEXT: ret %tmp = call i64 @llvm.ptrauth.resign.load.relative(i64 %arg, i32 2, i64 %arg1, i32 2, i64 256,i64 256) ret i64 %tmp } ; note: addend is larger than 24bit integer define i64 @test_resign_load_relative_loadNegOffset_constdisc(i64 %arg,i64 %arg1) { ; UNCHECKED-LABEL: test_resign_load_relative_loadNegOffset_constdisc: ; UNCHECKED: %bb.0: ; UNCHECKED-NEXT: mov x16, x0 ; UNCHECKED-NEXT: autda x16, x1 ; UNCHECKED-NEXT: mov x17, #62980 ; UNCHECKED-NEXT: movk x17, #65535, lsl #16 ; UNCHECKED-NEXT: movk x17, #65535, lsl #32 ; UNCHECKED-NEXT: movk x17, #65535, lsl #48 ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: ldrsw x17, [x16] ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: mov x17, #256 ; UNCHECKED-NEXT: pacda x16, x17 ; UNCHECKED-NEXT: mov x0, x16 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_resign_load_relative_loadNegOffset_constdisc: ; CHECKED: %bb.0: ; CHECKED-NEXT: mov x16, x0 ; CHECKED-NEXT: autda x16, x1 ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 ; CHECKED-NEXT: b.eq [[L]]auth_success_7 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_7 ; CHECKED-NEXT: Lauth_success_7: ; CHECKED-NEXT: mov x17, #62980 ; CHECKED-NEXT: movk x17, #65535, lsl #16 ; CHECKED-NEXT: movk x17, #65535, lsl #32 ; CHECKED-NEXT: movk x17, #65535, lsl #48 ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: ldrsw x17, [x16] ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: mov x17, #256 ; CHECKED-NEXT: pacda x16, x17 ; CHECKED-NEXT: Lresign_end_7: ; CHECKED-NEXT: mov x0, x16 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_resign_load_relative_loadNegOffset_constdisc: ; TRAP: %bb.0: ; TRAP-NEXT: mov x16, x0 ; TRAP-NEXT: autda x16, x1 ; TRAP-NEXT: mov x17, x16 ; TRAP-NEXT: xpacd x17 ; TRAP-NEXT: cmp x16, x17 ; TRAP-NEXT: b.eq [[L]]auth_success_7 ; TRAP-NEXT: brk #0xc472 ; TRAP-NEXT: Lauth_success_7: ; TRAP-NEXT: mov x17, #62980 ; TRAP-NEXT: movk x17, #65535, lsl #16 ; TRAP-NEXT: movk x17, #65535, lsl #32 ; TRAP-NEXT: movk x17, #65535, lsl #48 ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: ldrsw x17, [x16] ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: mov x17, #256 ; TRAP-NEXT: pacda x16, x17 ; TRAP-NEXT: mov x0, x16 ; TRAP-NEXT: ret %tmp = call i64 @llvm.ptrauth.resign.load.relative(i64 %arg,i32 2,i64 %arg1,i32 2,i64 256,i64 -2556) ret i64 %tmp } define i64 @test_resign_load_relative_largeOffset_constdisc(i64 %arg,i64 %arg1) { ; UNCHECKED-LABEL: test_resign_load_relative_largeOffset_constdisc: ; UNCHECKED: %bb.0: ; UNCHECKED-NEXT: mov x16, x0 ; UNCHECKED-NEXT: autda x16, x1 ; UNCHECKED-NEXT: add x16, x16, #3884 ; UNCHECKED-NEXT: add x16, x16, #7, lsl #12 ; UNCHECKED-NEXT: ldrsw x17, [x16] ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: mov x17, #256 ; UNCHECKED-NEXT: pacda x16, x17 ; UNCHECKED-NEXT: mov x0, x16 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_resign_load_relative_largeOffset_constdisc: ; CHECKED: %bb.0: ; CHECKED-NEXT: mov x16, x0 ; CHECKED-NEXT: autda x16, x1 ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 ; CHECKED-NEXT: b.eq [[L]]auth_success_8 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_8 ; CHECKED-NEXT: Lauth_success_8: ; CHECKED-NEXT: add x16, x16, #3884 ; CHECKED-NEXT: add x16, x16, #7, lsl #12 ; CHECKED-NEXT: ldrsw x17, [x16] ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: mov x17, #256 ; CHECKED-NEXT: pacda x16, x17 ; CHECKED-NEXT: Lresign_end_8: ; CHECKED-NEXT: mov x0, x16 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_resign_load_relative_largeOffset_constdisc: ; TRAP: %bb.0: ; TRAP-NEXT: mov x16, x0 ; TRAP-NEXT: autda x16, x1 ; TRAP-NEXT: mov x17, x16 ; TRAP-NEXT: xpacd x17 ; TRAP-NEXT: cmp x16, x17 ; TRAP-NEXT: b.eq [[L]]auth_success_8 ; TRAP-NEXT: brk #0xc472 ; TRAP-NEXT: Lauth_success_8: ; TRAP-NEXT: add x16, x16, #3884 ; TRAP-NEXT: add x16, x16, #7, lsl #12 ; TRAP-NEXT: ldrsw x17, [x16] ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: mov x17, #256 ; TRAP-NEXT: pacda x16, x17 ; TRAP-NEXT: mov x0, x16 ; TRAP-NEXT: ret %tmp = call i64 @llvm.ptrauth.resign.load.relative(i64 %arg,i32 2,i64 %arg1,i32 2,i64 256,i64 32556) ret i64 %tmp } define void @test_intrinsic_glue_chain_correctly_setup(ptr %0, i64 %1, ptr %2) { ; UNCHECKED-LABEL: test_intrinsic_glue_chain_correctly_setup: ; UNCHECKED: %bb.0: ; UNCHECKED-NEXT: str x2, [x0] ; UNCHECKED-NEXT: mov x16, x1 ; UNCHECKED-NEXT: mov x17, #29199 ; UNCHECKED-NEXT: autda x16, x17 ; UNCHECKED-NEXT: ldrsw x17, [x16, #0]! ; UNCHECKED-NEXT: add x16, x16, x17 ; UNCHECKED-NEXT: mov x17, #29199 ; UNCHECKED-NEXT: pacia x16, x17 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_intrinsic_glue_chain_correctly_setup: ; CHECKED: %bb.0: ; CHECKED-NEXT: str x2, [x0] ; CHECKED-NEXT: mov x16, x1 ; CHECKED-NEXT: mov x17, #29199 ; CHECKED-NEXT: autda x16, x17 ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 ; CHECKED-NEXT: b.eq [[L]]auth_success_9 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_9 ; CHECKED-NEXT: Lauth_success_9: ; CHECKED-NEXT: ldrsw x17, [x16, #0]! ; CHECKED-NEXT: add x16, x16, x17 ; CHECKED-NEXT: mov x17, #29199 ; CHECKED-NEXT: pacia x16, x17 ; CHECKED-NEXT: Lresign_end_9: ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_intrinsic_glue_chain_correctly_setup: ; TRAP: %bb.0: ; TRAP-NEXT: str x2, [x0] ; TRAP-NEXT: mov x16, x1 ; TRAP-NEXT: mov x17, #29199 ; TRAP-NEXT: autda x16, x17 ; TRAP-NEXT: mov x17, x16 ; TRAP-NEXT: xpacd x17 ; TRAP-NEXT: cmp x16, x17 ; TRAP-NEXT: b.eq [[L]]auth_success_9 ; TRAP-NEXT: brk #0xc472 ; TRAP-NEXT: Lauth_success_9: ; TRAP-NEXT: ldrsw x17, [x16, #0]! ; TRAP-NEXT: add x16, x16, x17 ; TRAP-NEXT: mov x17, #29199 ; TRAP-NEXT: pacia x16, x17 ; TRAP-NEXT: ret store ptr %2, ptr %0, align 8 %15 = tail call i64 @llvm.ptrauth.resign.load.relative(i64 %1, i32 2, i64 29199, i32 0, i64 29199, i64 0) ret void } declare i64 @llvm.ptrauth.auth(i64, i32, i64) declare i64 @llvm.ptrauth.resign(i64, i32, i64, i32, i64) declare i64 @llvm.ptrauth.resign.load.relative(i64,i32,i64,i32,i64,i64)