diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -815,38 +815,56 @@ // v8.3a Pointer Authentication // These instructions inhabit part of the hint space and so can be used for -// armv8 targets +// armv8 targets. Keeping the old HINT mnemonic when compiling without PA is +// important for compatibility with other assemblers (e.g. GAS) when building +// software compatible with both CPUs that do or don't implement PA. let Uses = [LR], Defs = [LR] in { - def PACIAZ : SystemNoOperands<0b000, "paciaz">; - def PACIBZ : SystemNoOperands<0b010, "pacibz">; + def PACIAZ : SystemNoOperands<0b000, "hint #24">; + def PACIBZ : SystemNoOperands<0b010, "hint #26">; let isAuthenticated = 1 in { - def AUTIAZ : SystemNoOperands<0b100, "autiaz">; - def AUTIBZ : SystemNoOperands<0b110, "autibz">; + def AUTIAZ : SystemNoOperands<0b100, "hint #28">; + def AUTIBZ : SystemNoOperands<0b110, "hint #30">; } } let Uses = [LR, SP], Defs = [LR] in { - def PACIASP : SystemNoOperands<0b001, "paciasp">; - def PACIBSP : SystemNoOperands<0b011, "pacibsp">; + def PACIASP : SystemNoOperands<0b001, "hint #25">; + def PACIBSP : SystemNoOperands<0b011, "hint #27">; let isAuthenticated = 1 in { - def AUTIASP : SystemNoOperands<0b101, "autiasp">; - def AUTIBSP : SystemNoOperands<0b111, "autibsp">; + def AUTIASP : SystemNoOperands<0b101, "hint #29">; + def AUTIBSP : SystemNoOperands<0b111, "hint #31">; } } let Uses = [X16, X17], Defs = [X17], CRm = 0b0001 in { - def PACIA1716 : SystemNoOperands<0b000, "pacia1716">; - def PACIB1716 : SystemNoOperands<0b010, "pacib1716">; + def PACIA1716 : SystemNoOperands<0b000, "hint #8">; + def PACIB1716 : SystemNoOperands<0b010, "hint #10">; let isAuthenticated = 1 in { - def AUTIA1716 : SystemNoOperands<0b100, "autia1716">; - def AUTIB1716 : SystemNoOperands<0b110, "autib1716">; + def AUTIA1716 : SystemNoOperands<0b100, "hint #12">; + def AUTIB1716 : SystemNoOperands<0b110, "hint #14">; } } let Uses = [LR], Defs = [LR], CRm = 0b0000 in { - def XPACLRI : SystemNoOperands<0b111, "xpaclri">; + def XPACLRI : SystemNoOperands<0b111, "hint #7">; } -// These pointer authentication isntructions require armv8.3a +// These pointer authentication instructions require armv8.3a let Predicates = [HasPA] in { + + // When compiling with PA, there is a better mnemonic for these instructions. + def : InstAlias<"paciaz", (PACIAZ), 1>; + def : InstAlias<"pacibz", (PACIBZ), 1>; + def : InstAlias<"autiaz", (AUTIAZ), 1>; + def : InstAlias<"autibz", (AUTIBZ), 1>; + def : InstAlias<"paciasp", (PACIASP), 1>; + def : InstAlias<"pacibsp", (PACIBSP), 1>; + def : InstAlias<"autiasp", (AUTIASP), 1>; + def : InstAlias<"autibsp", (AUTIBSP), 1>; + def : InstAlias<"pacia1716", (PACIA1716), 1>; + def : InstAlias<"pacib1716", (PACIB1716), 1>; + def : InstAlias<"autia1716", (AUTIA1716), 1>; + def : InstAlias<"autib1716", (AUTIB1716), 1>; + def : InstAlias<"xpaclri", (XPACLRI), 1>; + multiclass SignAuth prefix, bits<3> prefix_z, string asm> { def IA : SignAuthOneData; def IB : SignAuthOneData; diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-cfi.ll b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-cfi.ll --- a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-cfi.ll +++ b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-cfi.ll @@ -1,14 +1,18 @@ ; RUN: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ -; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s +; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s --check-prefixes CHECK,V8A +; RUN-V83A: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ +; RUN-V83A: aarch64-arm-none-eabi -mattr=+v8.3a %s -o - > %t +; RUN-V83A: FileCheck --check-prefixes CHECK,V83A < %t %s ; Function a's outlining candidate contains a sp modifying add without a ; corresponsing sub, so we shouldn't outline it. define void @a() "sign-return-address"="all" "sign-return-address-key"="b_key" { -; CHECK-LABEL: a: // @a -; CHECK: // %bb.0: -; CHECK-NEXT: .cfi_b_key_frame -; CHECK-NEXT: pacibsp -; CHECK-NEXT: .cfi_negate_ra_state +; CHECK-LABEL: a: // @a +; CHECK: // %bb.0: +; CHECK-NEXT: .cfi_b_key_frame +; V8A-NEXT: hint #27 +; V83A-NEXT: pacibsp +; V8A-NEXT, V83A-NEXT: .cfi_negate_ra_state %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 @@ -22,15 +26,17 @@ store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 ; CHECK-NOT: bl OUTLINED_FUNCTION_{{[0-9]+}} -; CHECK: autibsp -; CECK-NEXT: ret +; V8A: hint #31 +; V83A: autibsp +; CHECK-NEXT: ret ret void } define void @b() "sign-return-address"="all" "sign-return-address-key"="b_key" nounwind { ; CHECK-LABEL: b: // @b ; CHECK-NEXT: // %bb.0: -; CHECK-NEXT: pacibsp +; V8A-NEXT: hint #27 +; V83A-NEXT: pacibsp %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 @@ -44,15 +50,17 @@ store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 ; CHECK: bl [[OUTLINED_FUNC:OUTLINED_FUNCTION_[0-9]+]] -; CHECK: autibsp -; CHECK-NEXT: ret +; V8A: hint #31 +; V83A: autibsp +; V8A-NEXT, V83A-NEXT: ret ret void } define void @c() "sign-return-address"="all" "sign-return-address-key"="b_key" nounwind { ; CHECK-LABEL: c: // @c ; CHECK-NEXT: // %bb.0: -; CHECK-NEXT: pacibsp +; V8A-NEXT: hint #27 +; V83A-NEXT: pacibsp %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 @@ -66,15 +74,18 @@ store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 ; CHECK: bl [[OUTLINED_FUNC]] -; CHECK: autibsp -; CHECK-NEXT: ret +; V8A: hint #31 +; V83A: autibsp +; V8A-NEXT, V83A-NEXT: ret ret void } ; CHECK: [[OUTLINED_FUNC]] ; CHECK: // %bb.0: ; CHECK-NEXT: .cfi_b_key_frame -; CHECK-NEXT: pacibsp +; V8A-NEXT: hint #27 +; V83A-NEXT: pacibsp ; CHECK-NEXT: .cfi_negate_ra_state -; CHECK: autibsp -; CHECK-NEXT: ret +; V8A: hint #31 +; V83A: autibsp +; V8A-NEXT, V83A-NEXT: ret diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-diff-scope-same-key.ll b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-diff-scope-same-key.ll --- a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-diff-scope-same-key.ll +++ b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-diff-scope-same-key.ll @@ -1,9 +1,13 @@ ; RUN: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ -; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s +; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s --check-prefixes CHECK,V8A +; RUN-V83A: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ +; RUN-V83A: aarch64-arm-none-eabi -mattr=+v8.3a %s -o - > %t +; RUN-V83A: FileCheck --check-prefixes CHECK,V83A < %t %s define void @a() "sign-return-address"="all" { ; CHECK-LABEL: a: // @a -; CHECK: paciasp +; V8A: hint #25 +; V83A: paciasp ; CHECK-NEXT: .cfi_negate_ra_state %1 = alloca i32, align 4 %2 = alloca i32, align 4 @@ -17,14 +21,16 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autiasp +; V8A: hint #29 +; V83A: autiasp ret void ; CHECK: .cfi_endproc } define void @b() "sign-return-address"="non-leaf" { -; CHECK-LABEL: b: // @b -; CHECK-NOT: paciasp +; CHECK-LABE: b: // @b +; V8A-NOT: hint #25 +; V83A-NOT: paciasp ; CHECK-NOT: .cfi_negate_ra_state %1 = alloca i32, align 4 %2 = alloca i32, align 4 @@ -38,15 +44,17 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK-NOT: autiasp +; V8A-NOT: hint #29 +; V83A-NOT: autiasp ret void ; CHECK: .cfi_endproc } define void @c() "sign-return-address"="all" { -; CHECK-LABEL: c: // @c -; CHECK: paciasp -; CHECK-NEXT: .cfi_negate_ra_state +; CHECK-LABEL: c: // @c +; V8A: hint #25 +; V83A: paciasp +; V8A-NEXT, V83A-NEXT: .cfi_negate_ra_state %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 @@ -59,7 +67,8 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autiasp +; V8A: hint #29 +; V83A: autiasp ret void ; CHECK: .cfi_endproc } diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-non-leaf.ll b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-non-leaf.ll --- a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-non-leaf.ll +++ b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-non-leaf.ll @@ -1,10 +1,14 @@ ; RUN: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ -; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s +; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s --check-prefixes CHECK,V8A +; RUN-V83A: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ +; RUN-V83A: aarch64-arm-none-eabi -mattr=+v8.3a %s -o - > %t +; RUN-V83A: FileCheck --check-prefixes CHECK,V83A < %t %s define i64 @a(i64 %x) "sign-return-address"="non-leaf" "sign-return-address-key"="b_key" { ; CHECK-LABEL: a: // @a ; CHECK: .cfi_b_key_frame -; CHECK-NEXT: pacibsp +; V8A-NEXT: hint #27 +; V83A-NEXT: pacibsp ; CHECK-NEXT: .cfi_negate_ra_state %1 = alloca i32, align 4 %2 = alloca i32, align 4 @@ -25,7 +29,8 @@ define i64 @b(i64 %x) "sign-return-address"="non-leaf" "sign-return-address-key"="b_key" { ; CHECK-LABEL: b: // @b ; CHECK: .cfi_b_key_frame -; CHECK-NEXT: pacibsp +; V8A-NEXT: hint #27 +; V83A-NEXT: pacibsp ; CHECK-NEXT: .cfi_negate_ra_state %1 = alloca i32, align 4 %2 = alloca i32, align 4 @@ -46,7 +51,8 @@ define i64 @c(i64 %x) "sign-return-address"="non-leaf" "sign-return-address-key"="b_key" { ; CHECK-LABEL: c: // @c ; CHECK: .cfi_b_key_frame -; CHECK-NEXT: pacibsp +; V8A-NEXT: hint #27 +; V83A-NEXT: pacibsp ; CHECK-NEXT: .cfi_negate_ra_state %1 = alloca i32, align 4 %2 = alloca i32, align 4 @@ -68,5 +74,6 @@ ; CHECK-LABEL: OUTLINED_FUNCTION_0: ; CHECK-NOT: .cfi_b_key_frame ; CHECK-NOT: paci{{[a,b]}}sp +; CHECK-NOT: hint #2{{[5,7]}} ; CHECK-NOT: .cfi_negate_ra_state ; CHECK-NOT: auti{{[a,b]}}sp diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-diff-key.ll b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-diff-key.ll --- a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-diff-key.ll +++ b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-diff-key.ll @@ -1,9 +1,13 @@ ; RUN: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ -; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s +; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s --check-prefixes CHECK,V8A +; RUN-V83A: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ +; RUN-V83A: aarch64-arm-none-eabi -mattr=+v8.3a %s -o - > %t +; RUN-V83A: FileCheck --check-prefixes CHECK,V83A < %t %s define void @a() "sign-return-address"="all" { ; CHECK-LABEL: a: // @a -; CHECK: paciasp +; V8A: hint #25 +; V83A: paciasp ; CHECK-NEXT: .cfi_negate_ra_state %1 = alloca i32, align 4 %2 = alloca i32, align 4 @@ -17,7 +21,8 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autiasp +; V8A: hint #29 +; V83A: autiasp ret void ; CHECK: .cfi_endproc } @@ -25,7 +30,8 @@ define void @b() "sign-return-address"="all" "sign-return-address-key"="b_key" { ; CHECK-LABEL: b: // @b ; CHECK: .cfi_b_key_frame -; CHECK-NEXT: pacibsp +; V8A-NEXT: hint #27 +; V83A-NEXT: pacibsp ; CHECK-NEXT: .cfi_negate_ra_state %1 = alloca i32, align 4 %2 = alloca i32, align 4 @@ -39,14 +45,16 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK-NOT: autiasp +; V8A-NOT: hint #29 +; V83A-NOT: autiasp ret void ; CHECK: .cfi_endproc } define void @c() "sign-return-address"="all" { ; CHECK-LABEL: c: // @c -; CHECK: paciasp +; V8A: hint #25 +; V83A: paciasp ; CHECK-NEXT: .cfi_negate_ra_state %1 = alloca i32, align 4 %2 = alloca i32, align 4 @@ -60,7 +68,8 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autiasp +; V8A: hint #29 +; V83A: autiasp ret void ; CHECK: .cfi_endproc } diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-same-key-a.ll b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-same-key-a.ll --- a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-same-key-a.ll +++ b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-same-key-a.ll @@ -1,9 +1,13 @@ ; RUN: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ -; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s +; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s --check-prefixes CHECK,V8A +; RUN-V83A: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ +; RUN-V83A: aarch64-arm-none-eabi -mattr=+v8.3a %s -o - > %t +; RUN-V83A: FileCheck --check-prefixes CHECK,V83A < %t %s define void @a() "sign-return-address"="all" "sign-return-address-key"="a_key" nounwind { ; CHECK-LABEL: a: // @a -; CHECK: paciasp +; V8A: hint #25 +; V83A: paciasp %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 @@ -16,13 +20,15 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autiasp +; V8A: hint #29 +; V83A: autiasp ret void } define void @b() "sign-return-address"="all" nounwind { ; CHECK-LABEL: b: // @b -; CHECK: paciasp +; V8A: hint #25 +; V83A: paciasp %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 @@ -35,13 +41,15 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autiasp +; V8A: hint #29 +; V83A: autiasp ret void } define void @c() "sign-return-address"="all" nounwind { ; CHECK-LABEL: c: // @c -; CHECK: paciasp +; V8A: hint #25 +; V83A: paciasp %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 @@ -54,11 +62,14 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autiasp +; V8A: hint #29 +; V83A: autiasp ret void } ; CHECK-LABEL: OUTLINED_FUNCTION_0: -; CHECK: paciasp -; CHECK: autiasp +; V8A: hint #25 +; V83A: paciasp +; V8A: hint #29 +; V83A: autiasp ; CHECK-NEXT: ret diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-same-key-b.ll b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-same-key-b.ll --- a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-same-key-b.ll +++ b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-same-key-b.ll @@ -1,10 +1,14 @@ ; RUN: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ -; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s +; RUN: aarch64-arm-none-eabi %s -o - | FileCheck %s --check-prefixes CHECK,V8A +; RUN-V83A: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ +; RUN-V83A: aarch64-arm-none-eabi -mattr=+v8.3a %s -o - > %t +; RUN-V83A: FileCheck --check-prefixes CHECK,V83A < %t %s define void @a() "sign-return-address"="all" "sign-return-address-key"="b_key" nounwind { ; CHECK-LABEL: a: // @a ; CHECK-NEXT: // %bb.0: -; CHECK-NEXT: pacibsp +; V8A: hint #27 +; V83A: pacibsp %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 @@ -17,14 +21,16 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autibsp +; V8A: hint #31 +; V83A: autibsp ret void } define void @b() "sign-return-address"="all" "sign-return-address-key"="b_key" nounwind { ; CHECK-LABEL: b: // @b ; CHECK-NEXT: // %bb.0: -; CHECK-NEXT: pacibsp +; V8A: hint #27 +; V83A: pacibsp %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 @@ -37,14 +43,16 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autibsp +; V8A: hint #31 +; V83A: autibsp ret void } define void @c() "sign-return-address"="all" "sign-return-address-key"="b_key" nounwind { ; CHECK-LABEL: c: // @c ; CHECK-NEXT: // %bb.0: -; CHECK-NEXT: pacibsp +; V8A: hint #27 +; V83A: pacibsp %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 @@ -57,14 +65,17 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autibsp +; V8A: hint #31 +; V83A: autibsp ret void } ; CHECK-LABEL: OUTLINED_FUNCTION_0: ; CHECK: // %bb.0: ; CHECK-NEXT: .cfi_b_key_frame -; CHECK-NEXT: pacibsp +; V8A-NEXT: hint #27 +; V83A-NEXT: pacibsp ; CHECK-NEXT: .cfi_negate_ra_state -; CHECK: autibsp +; V8A: hint #31 +; V83A: autibsp ; CHECK-NEXT: ret diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-subtarget.ll b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-subtarget.ll --- a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-subtarget.ll +++ b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-subtarget.ll @@ -57,7 +57,7 @@ ; CHECK-LABEL: c: // @c ; CHECK: // %bb.0: ; CHECK-NEXT: .cfi_b_key_frame -; CHECK-NEXT: pacibsp +; CHECK-NEXT: hint #27 ; CHECK-NEXT: .cfi_negate_ra_state ; CHECK-NOT: OUTLINED_FUNCTION_ %1 = alloca i32, align 4 @@ -72,7 +72,7 @@ store i32 4, i32* %4, align 4 store i32 5, i32* %5, align 4 store i32 6, i32* %6, align 4 -; CHECK: autibsp +; CHECK: hint #31 ; CHECK-NOT: ret{{[a,b]}} ret void } diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-thunk.ll b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-thunk.ll --- a/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-thunk.ll +++ b/llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-thunk.ll @@ -1,13 +1,18 @@ ; RUN: llc -mtriple aarch64-arm-linux-gnu --enable-machine-outliner \ -; RUN: -verify-machineinstrs %s -o - | FileCheck %s +; RUN: -verify-machineinstrs %s -o - | FileCheck --check-prefixes CHECK,V8A %s +; RUN-V83A: llc -mtriple aarch64-arm-none-eabi -enable-machine-outliner \ +; RUN-V83A: -verify-machineinstrs -mattr=+v8.3a %s -o - > %t +; RUN-V83A: FileCheck --check-prefixes CHECK,V83A < %t %s declare i32 @thunk_called_fn(i32, i32, i32, i32) define i32 @a() #0 { ; CHECK-LABEL: a: // @a ; CHECK: // %bb.0: // %entry -; CHECK-NEXT: paciasp -; CHECK: autiasp +; V8A-NEXT: hint #25 +; V83A-NEXT: paciasp +; V8A: hint #29 +; V83A: autiasp ; CHECK-NEXT: ret entry: %call = tail call i32 @thunk_called_fn(i32 1, i32 2, i32 3, i32 4) @@ -18,9 +23,11 @@ define i32 @b() #0 { ; CHECK-LABEL: b: // @b ; CHECK: // %bb.0: // %entry -; CHECK-NEXT: paciasp +; V8A-NEXT: hint #25 +; V83A-NEXT: paciasp ; CHECK-NEXT: .cfi_negate_ra_state -; CHECK: autiasp +; V8A: hint #29 +; V83A: autiasp ; CHECK-NEXT: ret entry: %call = tail call i32 @thunk_called_fn(i32 1, i32 2, i32 3, i32 4) @@ -31,9 +38,11 @@ define hidden i32 @c(i32 (i32, i32, i32, i32)* %fptr) #0 { ; CHECK-LABEL: c: // @c ; CHECK: // %bb.0: // %entry -; CHECK-NEXT: paciasp +; V8A-NEXT: hint #25 +; V83A-NEXT: paciasp ; CHECK-NEXT: .cfi_negate_ra_state -; CHECK: autiasp +; V8A: hint #29 +; V83A: autiasp ; CHECK-NEXT: ret entry: %call = tail call i32 %fptr(i32 1, i32 2, i32 3, i32 4) @@ -44,9 +53,11 @@ define hidden i32 @d(i32 (i32, i32, i32, i32)* %fptr) #0 { ; CHECK-LABEL: d: // @d ; CHECK: // %bb.0: // %entry -; CHECK-NEXT: paciasp +; V8A-NEXT: hint #25 +; V83A-NEXT: paciasp ; CHECK-NEXT: .cfi_negate_ra_state -; CHECK: autiasp +; V8A: hint #29 +; V83A: autiasp ; CHECK-NEXT: ret entry: %call = tail call i32 %fptr(i32 1, i32 2, i32 3, i32 4) @@ -59,5 +70,7 @@ ; CHECK-NOT: [[OUTLINED_FUNCTION_{{.*}}]] ; CHECK-NOT: .cfi_b_key_frame ; CHECK-NOT: paci{{[a,b]}}sp +; CHECK-NOT: hint #2{{[5,7]}} ; CHECK-NOT: .cfi_negate_ra_state ; CHECK-NOT: auti{{[a,b]}}sp +; CHECK-NOT: hint #{{[29,31]}} diff --git a/llvm/test/CodeGen/AArch64/sign-return-address.ll b/llvm/test/CodeGen/AArch64/sign-return-address.ll --- a/llvm/test/CodeGen/AArch64/sign-return-address.ll +++ b/llvm/test/CodeGen/AArch64/sign-return-address.ll @@ -1,4 +1,5 @@ -; RUN: llc -mtriple=aarch64-none-eabi < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-none-eabi < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-none-eabi -mattr=v8.3a < %s | FileCheck --check-prefix CHECK-V83A %s ; CHECK-LABEL: @leaf ; CHECK-NOT: paci{{[a,b]}}sp @@ -22,19 +23,23 @@ } ; CHECK-LABEL: @leaf_sign_all -; CHECK: paciasp -; CHECK: autiasp -; CHECK: ret +; CHECK: hint #25 +; CHECK: hint #29 +; CHECK: ret +; CHECK-V83A: paciasp +; CHECK-V83A: retaa define i32 @leaf_sign_all(i32 %x) "sign-return-address"="all" { ret i32 %x } -; CHECK: @leaf_clobbers_lr -; CHECK: paciasp -; CHECK: str x30, [sp, #-16]! -; CHECK: ldr x30, [sp], #16 -; CHECK-NEXT: autiasp -; CHECK: ret +; CHECK: @leaf_clobbers_lr +; CHECK: hint #25 +; CHECK-V83A: paciasp +; CHECK, CHECK-V83A: str x30, [sp, #-16]! +; CHECK, CHECK-V83A: ldr x30, [sp], #16 +; CHECK: hint #29 +; CHECK: ret +; CHECK-V32A-NEXT: retaa define i64 @leaf_clobbers_lr(i64 %x) "sign-return-address"="non-leaf" { call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1 ret i64 %x @@ -42,21 +47,25 @@ declare i32 @foo(i32) -; CHECK: @non_leaf_sign_all -; CHECK: paciasp -; CHECK: autiasp -; CHECK: ret +; CHECK: @non_leaf_sign_all +; CHECK: hint #25 +; CHECK: hint #29 +; CHECK: ret +; CHECK-V83A: paciasp +; CHECK-V83A: retaa define i32 @non_leaf_sign_all(i32 %x) "sign-return-address"="all" { %call = call i32 @foo(i32 %x) ret i32 %call } -; CHECK: @non_leaf_sign_non_leaf -; CHECK: paciasp -; CHECK: str x30, [sp, #-16]! -; CHECK: ldr x30, [sp], #16 -; CHECK: autiasp -; CHECK: ret +; CHECK: @non_leaf_sign_non_leaf +; CHECK: hint #25 +; CHECK-V83A: paciasp +; CHECK, CHECK-V83A: str x30, [sp, #-16]! +; CHECK, CHECK-V83A: ldr x30, [sp], #16 +; CHECK: hint #29 +; CHECK: ret +; CHECK-V83A: retaa define i32 @non_leaf_sign_non_leaf(i32 %x) "sign-return-address"="non-leaf" { %call = call i32 @foo(i32 %x) ret i32 %call @@ -73,12 +82,14 @@ declare fastcc i64 @bar(i64) -; CHECK-LABEL: @spill_lr_and_tail_call -; CHECK: paciasp -; CHECK: str x30, [sp, #-16]! -; CHECK: ldr x30, [sp], #16 -; CHECK: autiasp -; CHECK: b bar +; CHECK-LABEL: @spill_lr_and_tail_call +; CHECK: hint #25 +; CHECK-V83A: paciasp +; CHECK, CHECK-V83A: str x30, [sp, #-16]! +; CHECK, CHECK-V83A: ldr x30, [sp], #16 +; CHECK-V83A: autiasp +; CHECK: hint #29 +; CHECK: b bar define fastcc void @spill_lr_and_tail_call(i64 %x) "sign-return-address"="all" { call void asm sideeffect "mov x30, $0", "r,~{lr}"(i64 %x) #1 tail call fastcc i64 @bar(i64 %x) @@ -86,15 +97,19 @@ } ; CHECK-LABEL: @leaf_sign_all_a_key -; CHECK: paciasp -; CHECK: autiasp +; CHECK: hint #25 +; CHECK: hint #29 +; CHECK-V83A: paciasp +; CHECK-V83A: retaa define i32 @leaf_sign_all_a_key(i32 %x) "sign-return-address"="all" "sign-return-address-key"="a_key" { ret i32 %x } ; CHECK-LABEL: @leaf_sign_all_b_key -; CHECK: pacibsp -; CHECK: autibsp +; CHECK: hint #27 +; CHECK: hint #31 +; CHECK-V83A: pacibsp +; CHECK-V83A: retab define i32 @leaf_sign_all_b_key(i32 %x) "sign-return-address"="all" "sign-return-address-key"="b_key" { ret i32 %x } diff --git a/llvm/test/CodeGen/AArch64/speculation-hardening-dagisel.ll b/llvm/test/CodeGen/AArch64/speculation-hardening-dagisel.ll --- a/llvm/test/CodeGen/AArch64/speculation-hardening-dagisel.ll +++ b/llvm/test/CodeGen/AArch64/speculation-hardening-dagisel.ll @@ -18,7 +18,7 @@ ; NOSLH-NOT: dsb sy ; NOSLH-NOT: isb if.then: - %0 = tail call i64 asm "autia1716", "={x17},{x16},0"(i64 %b, i64 %a) + %0 = tail call i64 asm "hint #12", "={x17},{x16},0"(i64 %b, i64 %a) ; CHECK: bl g ; SLH: dsb sy ; SLH: isb diff --git a/llvm/test/CodeGen/AArch64/speculation-hardening-loads.ll b/llvm/test/CodeGen/AArch64/speculation-hardening-loads.ll --- a/llvm/test/CodeGen/AArch64/speculation-hardening-loads.ll +++ b/llvm/test/CodeGen/AArch64/speculation-hardening-loads.ll @@ -90,7 +90,7 @@ ; CHECK: dsb sy ; CHECK: isb entry: - %0 = tail call i64 asm "autia1716", "={x17},{x16},0"(i64 %b, i64 %a) + %0 = tail call i64 asm "hint #12", "={x17},{x16},0"(i64 %b, i64 %a) %X = load i64, i64* %p, align 8 %ret = add i64 %X, %0 ; CHECK-NOT: csdb diff --git a/llvm/test/MC/AArch64/armv8.3a-signed-pointer.s b/llvm/test/MC/AArch64/armv8.3a-signed-pointer.s --- a/llvm/test/MC/AArch64/armv8.3a-signed-pointer.s +++ b/llvm/test/MC/AArch64/armv8.3a-signed-pointer.s @@ -1,8 +1,8 @@ // RUN: llvm-mc -triple aarch64-none-linux-gnu -show-encoding -mattr=+v8.3a -o - %s 2>&1 | \ // RUN: FileCheck --check-prefixes=CHECK,ALL %s -// RUN: not llvm-mc -triple aarch64-none-linux-gnu %s -o - > %t.1 2>%t.2 -// RUN: FileCheck --check-prefixes=ALL,NOENC %s < %t.1 +// RUN: not llvm-mc -triple aarch64-none-linux-gnu -show-encoding %s -o - > %t.1 2>%t.2 +// RUN: FileCheck --check-prefixes=ALL %s < %t.1 // RUN: FileCheck --check-prefix=CHECK-REQ %s < %t.2 // ALL: .text @@ -98,43 +98,56 @@ // ALL-EMPTY: paciasp // CHECK-NEXT: paciasp // encoding: [0x3f,0x23,0x03,0xd5] -// NOENC-NEXT: paciasp +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: paciasp autiasp // CHECK-NEXT: autiasp // encoding: [0xbf,0x23,0x03,0xd5] -// NOENC-NEXT: autiasp +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: autiasp paciaz // CHECK-NEXT: paciaz // encoding: [0x1f,0x23,0x03,0xd5] -// NOENC-NEXT: paciaz +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: paciaz autiaz // CHECK-NEXT: autiaz // encoding: [0x9f,0x23,0x03,0xd5] -// NOENC-NEXT: autiaz +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: autiaz pacia1716 // CHECK-NEXT: pacia1716 // encoding: [0x1f,0x21,0x03,0xd5] -// NOENC-NEXT: pacia1716 +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: pacia1716 autia1716 // CHECK-NEXT: autia1716 // encoding: [0x9f,0x21,0x03,0xd5] -// NOENC-NEXT: autia1716 +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: autia1716 pacibsp // CHECK-NEXT: pacibsp // encoding: [0x7f,0x23,0x03,0xd5] -// NOENC-NEXT: pacibsp +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: pacibsp autibsp // CHECK-NEXT: autibsp // encoding: [0xff,0x23,0x03,0xd5] -// NOENC-NEXT: autibsp +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: autibsp pacibz // CHECK-NEXT: pacibz // encoding: [0x5f,0x23,0x03,0xd5] -// NOENC-NEXT: pacibz +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: pacibz autibz // CHECK-NEXT: autibz // encoding: [0xdf,0x23,0x03,0xd5] -// NOENC-NEXT: autibz +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: autibz pacib1716 // CHECK-NEXT: pacib1716 // encoding: [0x5f,0x21,0x03,0xd5] -// NOENC-NEXT: pacib1716 +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: pacib1716 autib1716 // CHECK-NEXT: autib1716 // encoding: [0xdf,0x21,0x03,0xd5] -// NOENC-NEXT: autib1716 +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: autib1716 xpaclri -// CHECK-NEXT: xpaclri // encoding: [0xff,0x20,0x03,0xd5] -// NOENC-NEXT: xpaclri +// CHECK-NEXT: xpaclri // encoding: [0xff,0x20,0x03,0xd5] +// CHECK-REQ: error: instruction requires: pa +// CHECK-REQ-NEXT: xpaclri // ALL-EMPTY: pacia x0, x1