diff --git a/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td b/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td index d1d0c5ff87341..79c07bc2fc920 100644 --- a/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td +++ b/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td @@ -148,6 +148,7 @@ def : GINodeEquiv; def : GINodeEquiv; def : GINodeEquiv; def : GINodeEquiv; +def : GINodeEquiv; def : GINodeEquiv; def : GINodeEquiv; def : GINodeEquiv; diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp index 6024027afaf6c..400024922124c 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp @@ -1316,6 +1316,10 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) .widenScalarOrEltToNextPow2(0) .immIdx(0); // Inform verifier imm idx 0 is handled. + // TODO: {nxv16s8, s8}, {nxv8s16, s16} + getActionDefinitionsBuilder(G_SPLAT_VECTOR) + .legalFor(HasSVE, {{nxv4s32, s32}, {nxv2s64, s64}}); + getLegacyLegalizerInfo().computeTables(); verify(*ST.getInstrInfo()); } diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/select-splat-vector.ll b/llvm/test/CodeGen/AArch64/GlobalISel/select-splat-vector.ll new file mode 100644 index 0000000000000..0193952aa2ab2 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/GlobalISel/select-splat-vector.ll @@ -0,0 +1,73 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 +; RUN: llc < %s -mtriple aarch64 -mattr=+sve -aarch64-enable-gisel-sve=1 | FileCheck %s --check-prefixes=CHECK,CHECK-SDAG +; RUN: llc < %s -mtriple aarch64 -mattr=+sve -global-isel -aarch64-enable-gisel-sve=1 | FileCheck %s --check-prefixes=CHECK,CHECK-GS + +; REQUIRES: asserts, aarch64-registered-target + +;; add +define @addnxv2i64( %a, %b) { +; CHECK-SDAG-LABEL: addnxv2i64: +; CHECK-SDAG: // %bb.0: // %entry +; CHECK-SDAG-NEXT: add z0.d, z0.d, #9 // =0x9 +; CHECK-SDAG-NEXT: ret +; +; CHECK-GS-LABEL: addnxv2i64: +; CHECK-GS: // %bb.0: // %entry +; CHECK-GS-NEXT: mov w8, #9 // =0x9 +; CHECK-GS-NEXT: mov z1.d, x8 +; CHECK-GS-NEXT: add z0.d, z0.d, z1.d +; CHECK-GS-NEXT: ret +entry: + %c = add %a, splat (i64 9) + ret %c +} + +define @splarnxv2i64( %a, %b) { +; CHECK-SDAG-LABEL: splarnxv2i64: +; CHECK-SDAG: // %bb.0: // %entry +; CHECK-SDAG-NEXT: mov z0.d, #9 // =0x9 +; CHECK-SDAG-NEXT: ret +; +; CHECK-GS-LABEL: splarnxv2i64: +; CHECK-GS: // %bb.0: // %entry +; CHECK-GS-NEXT: mov w8, #9 // =0x9 +; CHECK-GS-NEXT: mov z0.d, x8 +; CHECK-GS-NEXT: ret +entry: + ret splat (i64 9) +} + +define @addnxv4i32( %a, %b) { +; CHECK-SDAG-LABEL: addnxv4i32: +; CHECK-SDAG: // %bb.0: // %entry +; CHECK-SDAG-NEXT: add z0.s, z0.s, #9 // =0x9 +; CHECK-SDAG-NEXT: ret +; +; CHECK-GS-LABEL: addnxv4i32: +; CHECK-GS: // %bb.0: // %entry +; CHECK-GS-NEXT: mov w8, #9 // =0x9 +; CHECK-GS-NEXT: mov z1.s, w8 +; CHECK-GS-NEXT: add z0.s, z0.s, z1.s +; CHECK-GS-NEXT: ret +entry: + %c = add %a, splat (i32 9) + ret %c +} + +define @splatnxv4i32( %a, %b) { +; CHECK-SDAG-LABEL: splatnxv4i32: +; CHECK-SDAG: // %bb.0: // %entry +; CHECK-SDAG-NEXT: mov z0.s, #9 // =0x9 +; CHECK-SDAG-NEXT: ret +; +; CHECK-GS-LABEL: splatnxv4i32: +; CHECK-GS: // %bb.0: // %entry +; CHECK-GS-NEXT: mov w8, #9 // =0x9 +; CHECK-GS-NEXT: mov z0.s, w8 +; CHECK-GS-NEXT: ret +entry: + ret splat (i32 9) +} + +;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: +; CHECK: {{.*}}