From 0395584c55427b43fe81f4a4fc69e637b145d5ec Mon Sep 17 00:00:00 2001 From: Ricardo Jesus Date: Wed, 4 Jun 2025 08:53:51 -0700 Subject: [PATCH 1/3] Precommit tests. --- .../CodeGen/AArch64/sve2-intrinsics-crypto.ll | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll b/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll index fe8271cdf054b..5266cc1175af4 100644 --- a/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll +++ b/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll @@ -16,6 +16,18 @@ define @aesd_i8( %a, %b) ret %out } +define @aesd_i8_commuted( %a, +; CHECK-LABEL: aesd_i8_commuted: +; CHECK: // %bb.0: +; CHECK-NEXT: aesd z1.b, z1.b, z0.b +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ret + %b) { + %out = call @llvm.aarch64.sve.aesd( %b, + %a) + ret %out +} + ; ; AESIMC ; @@ -43,6 +55,18 @@ define @aese_i8( %a, %b) ret %out } +define @aese_i8_commuted( %a, +; CHECK-LABEL: aese_i8_commuted: +; CHECK: // %bb.0: +; CHECK-NEXT: aese z1.b, z1.b, z0.b +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ret + %b) { + %out = call @llvm.aarch64.sve.aese( %b, + %a) + ret %out +} + ; ; AESMC ; From 52274feb7fa128691b6d4729988e282d5745be93 Mon Sep 17 00:00:00 2001 From: Ricardo Jesus Date: Wed, 4 Jun 2025 08:44:23 -0700 Subject: [PATCH 2/3] [AArch64][SVE] Mark AES instructions commutable. We are already doing this for the Neon versions of the instructions, just not for SVE. --- llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td | 4 ++-- llvm/lib/Target/AArch64/SVEInstrFormats.td | 4 +++- llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll | 6 ++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index 91db6b6fc7984..287d0436af7c5 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -4064,8 +4064,8 @@ let Predicates = [HasSVE2_or_SME] in { let Predicates = [HasSVEAES, HasNonStreamingSVE2_or_SSVE_AES] in { // SVE2 crypto destructive binary operations - defm AESE_ZZZ_B : sve2_crypto_des_bin_op<0b00, "aese", ZPR8, int_aarch64_sve_aese, nxv16i8>; - defm AESD_ZZZ_B : sve2_crypto_des_bin_op<0b01, "aesd", ZPR8, int_aarch64_sve_aesd, nxv16i8>; + defm AESE_ZZZ_B : sve2_crypto_des_bin_op<0b00, "aese", ZPR8, int_aarch64_sve_aese, nxv16i8, /*commutable=*/1>; + defm AESD_ZZZ_B : sve2_crypto_des_bin_op<0b01, "aesd", ZPR8, int_aarch64_sve_aesd, nxv16i8, /*commutable=*/1>; // SVE2 crypto unary operations defm AESMC_ZZ_B : sve2_crypto_unary_op<0b0, "aesmc", int_aarch64_sve_aesmc>; diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index c56713783289e..d68a0bd8c7b39 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -9254,7 +9254,9 @@ class sve2_crypto_des_bin_op opc, string asm, ZPRRegOp zprty> } multiclass sve2_crypto_des_bin_op opc, string asm, ZPRRegOp zprty, - SDPatternOperator op, ValueType vt> { + SDPatternOperator op, ValueType vt, + bit commutable = 0> { + let isCommutable = commutable in def NAME : sve2_crypto_des_bin_op; def : SVE_2_Op_Pat(NAME)>; } diff --git a/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll b/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll index 5266cc1175af4..f477fcbe1eb5b 100644 --- a/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll +++ b/llvm/test/CodeGen/AArch64/sve2-intrinsics-crypto.ll @@ -19,8 +19,7 @@ define @aesd_i8( %a, %b) define @aesd_i8_commuted( %a, ; CHECK-LABEL: aesd_i8_commuted: ; CHECK: // %bb.0: -; CHECK-NEXT: aesd z1.b, z1.b, z0.b -; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: aesd z0.b, z0.b, z1.b ; CHECK-NEXT: ret %b) { %out = call @llvm.aarch64.sve.aesd( %b, @@ -58,8 +57,7 @@ define @aese_i8( %a, %b) define @aese_i8_commuted( %a, ; CHECK-LABEL: aese_i8_commuted: ; CHECK: // %bb.0: -; CHECK-NEXT: aese z1.b, z1.b, z0.b -; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: aese z0.b, z0.b, z1.b ; CHECK-NEXT: ret %b) { %out = call @llvm.aarch64.sve.aese( %b, From 211cb2ee46d3466d760f499df50cec35e23725ac Mon Sep 17 00:00:00 2001 From: Ricardo Jesus Date: Thu, 5 Jun 2025 06:50:27 -0700 Subject: [PATCH 3/3] Move pattern to main class. --- llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td | 8 +++++--- llvm/lib/Target/AArch64/SVEInstrFormats.td | 13 +++---------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index 287d0436af7c5..12da015ae0ddb 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -4064,8 +4064,10 @@ let Predicates = [HasSVE2_or_SME] in { let Predicates = [HasSVEAES, HasNonStreamingSVE2_or_SSVE_AES] in { // SVE2 crypto destructive binary operations - defm AESE_ZZZ_B : sve2_crypto_des_bin_op<0b00, "aese", ZPR8, int_aarch64_sve_aese, nxv16i8, /*commutable=*/1>; - defm AESD_ZZZ_B : sve2_crypto_des_bin_op<0b01, "aesd", ZPR8, int_aarch64_sve_aesd, nxv16i8, /*commutable=*/1>; + let isCommutable = 1 in { + def AESE_ZZZ_B : sve2_crypto_des_bin_op<0b00, "aese", ZPR8, int_aarch64_sve_aese, nxv16i8>; + def AESD_ZZZ_B : sve2_crypto_des_bin_op<0b01, "aesd", ZPR8, int_aarch64_sve_aesd, nxv16i8>; + } // SVE2 crypto unary operations defm AESMC_ZZ_B : sve2_crypto_unary_op<0b0, "aesmc", int_aarch64_sve_aesmc>; @@ -4082,7 +4084,7 @@ let Predicates = [HasSVE2SM4] in { // SVE2 crypto constructive binary operations defm SM4EKEY_ZZZ_S : sve2_crypto_cons_bin_op<0b0, "sm4ekey", ZPR32, int_aarch64_sve_sm4ekey, nxv4i32>; // SVE2 crypto destructive binary operations - defm SM4E_ZZZ_S : sve2_crypto_des_bin_op<0b10, "sm4e", ZPR32, int_aarch64_sve_sm4e, nxv4i32>; + def SM4E_ZZZ_S : sve2_crypto_des_bin_op<0b10, "sm4e", ZPR32, int_aarch64_sve_sm4e, nxv4i32>; } // End HasSVE2SM4 let Predicates = [HasSVE2SHA3] in { diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index d68a0bd8c7b39..56d124d0d7581 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -9235,11 +9235,12 @@ multiclass sve2_crypto_cons_bin_op(NAME)>; } -class sve2_crypto_des_bin_op opc, string asm, ZPRRegOp zprty> +class sve2_crypto_des_bin_op opc, string asm, ZPRRegOp zprty, + SDPatternOperator op, ValueType vt> : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm), asm, "\t$Zdn, $_Zdn, $Zm", "", - []>, Sched<[]> { + [(set (vt zprty:$Zdn), (op (vt zprty:$_Zdn), (vt zprty:$Zm)))]>, Sched<[]> { bits<5> Zdn; bits<5> Zm; let Inst{31-17} = 0b010001010010001; @@ -9253,14 +9254,6 @@ class sve2_crypto_des_bin_op opc, string asm, ZPRRegOp zprty> let hasSideEffects = 0; } -multiclass sve2_crypto_des_bin_op opc, string asm, ZPRRegOp zprty, - SDPatternOperator op, ValueType vt, - bit commutable = 0> { - let isCommutable = commutable in - def NAME : sve2_crypto_des_bin_op; - def : SVE_2_Op_Pat(NAME)>; -} - class sve2_crypto_unary_op : I<(outs zprty:$Zdn), (ins zprty:$_Zdn), asm, "\t$Zdn, $_Zdn",