From 16c4de1ffcc1006dc5c2aa085a20df03732f9581 Mon Sep 17 00:00:00 2001 From: David Green Date: Tue, 13 Jun 2023 11:21:18 +0100 Subject: [PATCH] [AArch64][SVE] Extra patterns for predicated and/or/xor Similar to the other patterns, this adds predicated and/xor/xor patterns. Differential Revision: https://reviews.llvm.org/D151086 --- llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td | 9 ++- llvm/lib/Target/AArch64/SVEInstrFormats.td | 8 +++ llvm/test/CodeGen/AArch64/sve-pred-selectop2.ll | 84 +++++++++++-------------- 3 files changed, 50 insertions(+), 51 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index 65ed502..79dbe72 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -444,6 +444,9 @@ def AArch64fmla_m1 : fma_patfrags; def AArch64mul_m1 : VSelectCommPredOrPassthruPatFrags; +def AArch64and_m1 : VSelectUnpredOrPassthruPatFrags; +def AArch64orr_m1 : VSelectUnpredOrPassthruPatFrags; +def AArch64eor_m1 : VSelectUnpredOrPassthruPatFrags; def AArch64smax_m1 : VSelectCommPredOrPassthruPatFrags; def AArch64umax_m1 : VSelectCommPredOrPassthruPatFrags; def AArch64smin_m1 : VSelectCommPredOrPassthruPatFrags; @@ -474,9 +477,9 @@ let Predicates = [HasSVEorSME] in { defm SUB_ZPmZ : sve_int_bin_pred_arit_0<0b001, "sub", "SUB_ZPZZ", AArch64sub_m1, DestructiveBinaryCommWithRev, "SUBR_ZPmZ">; defm SUBR_ZPmZ : sve_int_bin_pred_arit_0<0b011, "subr", "SUBR_ZPZZ", int_aarch64_sve_subr, DestructiveBinaryCommWithRev, "SUB_ZPmZ", /*isReverseInstr*/ 1>; - defm ORR_ZPmZ : sve_int_bin_pred_log<0b000, "orr", "ORR_ZPZZ", int_aarch64_sve_orr, DestructiveBinaryComm>; - defm EOR_ZPmZ : sve_int_bin_pred_log<0b001, "eor", "EOR_ZPZZ", int_aarch64_sve_eor, DestructiveBinaryComm>; - defm AND_ZPmZ : sve_int_bin_pred_log<0b010, "and", "AND_ZPZZ", int_aarch64_sve_and, DestructiveBinaryComm>; + defm ORR_ZPmZ : sve_int_bin_pred_log<0b000, "orr", "ORR_ZPZZ", AArch64orr_m1, DestructiveBinaryComm>; + defm EOR_ZPmZ : sve_int_bin_pred_log<0b001, "eor", "EOR_ZPZZ", AArch64eor_m1, DestructiveBinaryComm>; + defm AND_ZPmZ : sve_int_bin_pred_log<0b010, "and", "AND_ZPZZ", AArch64and_m1, DestructiveBinaryComm>; defm BIC_ZPmZ : sve_int_bin_pred_log<0b011, "bic", "BIC_ZPZZ", int_aarch64_sve_bic, DestructiveBinary>; } // End HasSVEorSME diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index b29aecc..90754d3 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -647,6 +647,14 @@ class VSelectCommPredOrPassthruPatFragsgetOpcode() != ISD::VSELECT || N->getOperand(1).hasOneUse(); }]>; +// Similarly matches either an intrinsic, or an unpredicated operation with a select +class VSelectUnpredOrPassthruPatFrags +: PatFrags<(ops node:$Pg, node:$Op1, node:$Op2), [ + (intrinsic node:$Pg, node:$Op1, node:$Op2), + (vselect node:$Pg, (sdnode node:$Op1, node:$Op2), node:$Op1), + ], [{ + return N->getOpcode() != ISD::VSELECT || N->getOperand(1).hasOneUse(); + }]>; // // Pseudo -> Instruction mappings diff --git a/llvm/test/CodeGen/AArch64/sve-pred-selectop2.ll b/llvm/test/CodeGen/AArch64/sve-pred-selectop2.ll index f980378..a171c11 100644 --- a/llvm/test/CodeGen/AArch64/sve-pred-selectop2.ll +++ b/llvm/test/CodeGen/AArch64/sve-pred-selectop2.ll @@ -535,9 +535,8 @@ define @and_nxv2i64_x( %x, %n, zeroinitializer @@ -550,9 +549,8 @@ define @and_nxv4i32_x( %x, %n, zeroinitializer @@ -565,9 +563,8 @@ define @and_nxv8i16_x( %x, %n, zeroinitializer @@ -580,9 +577,8 @@ define @and_nxv16i8_x( %x, %n, zeroinitializer @@ -595,9 +591,8 @@ define @or_nxv2i64_x( %x, %n, zeroinitializer @@ -610,9 +605,8 @@ define @or_nxv4i32_x( %x, %n, zeroinitializer @@ -625,9 +619,8 @@ define @or_nxv8i16_x( %x, %n, zeroinitializer @@ -640,9 +633,8 @@ define @or_nxv16i8_x( %x, %n, zeroinitializer @@ -655,9 +647,8 @@ define @xor_nxv2i64_x( %x, %n, zeroinitializer @@ -670,9 +661,8 @@ define @xor_nxv4i32_x( %x, %n, zeroinitializer @@ -685,9 +675,8 @@ define @xor_nxv8i16_x( %x, %n, zeroinitializer @@ -700,9 +689,8 @@ define @xor_nxv16i8_x( %x, %n, zeroinitializer @@ -1835,9 +1823,9 @@ define @and_nxv2i64_y( %x, %n, zeroinitializer @@ -1850,9 +1838,9 @@ define @and_nxv4i32_y( %x, %n, zeroinitializer @@ -1865,9 +1853,9 @@ define @and_nxv8i16_y( %x, %n, zeroinitializer @@ -1880,9 +1868,9 @@ define @and_nxv16i8_y( %x, %n, zeroinitializer @@ -1895,9 +1883,9 @@ define @or_nxv2i64_y( %x, %n, zeroinitializer @@ -1910,9 +1898,9 @@ define @or_nxv4i32_y( %x, %n, zeroinitializer @@ -1925,9 +1913,9 @@ define @or_nxv8i16_y( %x, %n, zeroinitializer @@ -1940,9 +1928,9 @@ define @or_nxv16i8_y( %x, %n, zeroinitializer @@ -1955,9 +1943,9 @@ define @xor_nxv2i64_y( %x, %n, zeroinitializer @@ -1970,9 +1958,9 @@ define @xor_nxv4i32_y( %x, %n, zeroinitializer @@ -1985,9 +1973,9 @@ define @xor_nxv8i16_y( %x, %n, zeroinitializer @@ -2000,9 +1988,9 @@ define @xor_nxv16i8_y( %x, %n, zeroinitializer -- 2.7.4