Skip to content

Commit a25a6e7

Browse files
author
Thorsten Schütt
committed
[GlobalISel][AArch64] Legalize G_SPLAT_VECTOR
1 parent b9978f8 commit a25a6e7

File tree

3 files changed

+148
-0
lines changed

3 files changed

+148
-0
lines changed

llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ def : GINodeEquiv<G_INSERT_VECTOR_ELT, vector_insert>;
148148
def : GINodeEquiv<G_CONCAT_VECTORS, concat_vectors>;
149149
def : GINodeEquiv<G_BUILD_VECTOR, build_vector>;
150150
def : GINodeEquiv<G_EXTRACT_SUBVECTOR, extract_subvector>;
151+
def : GINodeEquiv<G_SPLAT_VECTOR, splat_vector>;
151152
def : GINodeEquiv<G_FCEIL, fceil>;
152153
def : GINodeEquiv<G_FCOS, fcos>;
153154
def : GINodeEquiv<G_FSIN, fsin>;

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,6 +1316,10 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
13161316
.widenScalarOrEltToNextPow2(0)
13171317
.immIdx(0); // Inform verifier imm idx 0 is handled.
13181318

1319+
// TODO: {nxv8s16, s16}
1320+
getActionDefinitionsBuilder(G_SPLAT_VECTOR)
1321+
.legalFor(HasSVE, {{nxv4s32, s32}, {nxv2s64, s64}});
1322+
13191323
getLegacyLegalizerInfo().computeTables();
13201324
verify(*ST.getInstrInfo());
13211325
}
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -O0 -debug -mtriple=aarch64-apple-ios -mattr=+sve -aarch64-enable-gisel-sve=1 -global-isel -start-before=legalizer -stop-after=instruction-select %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SELECT
3+
# RUN: llc -O0 -mtriple=aarch64-apple-ios -mattr=+sve -aarch64-enable-gisel-sve=1 -global-isel -start-before=legalizer -stop-after=regbankselect %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-REGBANK
4+
# RUN: llc -O0 -mtriple=aarch64-apple-ios -mattr=+sve -aarch64-enable-gisel-sve=1 -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-LEGAL
5+
6+
7+
---
8+
name: test_splat_vector_s64
9+
body: |
10+
bb.1:
11+
; CHECK-SELECT-LABEL: name: test_splat_vector_s64
12+
; CHECK-SELECT: %imm:gpr64sp = COPY $x0
13+
; CHECK-SELECT-NEXT: %splat:zpr = DUP_ZR_D %imm
14+
; CHECK-SELECT-NEXT: $z0 = COPY %splat
15+
;
16+
; CHECK-REGBANK-LABEL: name: test_splat_vector_s64
17+
; CHECK-REGBANK: %imm:gpr(s64) = COPY $x0
18+
; CHECK-REGBANK-NEXT: %splat:fpr(<vscale x 2 x s64>) = G_SPLAT_VECTOR %imm(s64)
19+
; CHECK-REGBANK-NEXT: $z0 = COPY %splat(<vscale x 2 x s64>)
20+
;
21+
; CHECK-LEGAL-LABEL: name: test_splat_vector_s64
22+
; CHECK-LEGAL: %imm:_(s64) = COPY $x0
23+
; CHECK-LEGAL-NEXT: %splat:_(<vscale x 2 x s64>) = G_SPLAT_VECTOR %imm(s64)
24+
; CHECK-LEGAL-NEXT: $z0 = COPY %splat(<vscale x 2 x s64>)
25+
%imm:_(s64) = COPY $x0
26+
%splat:_(<vscale x 2 x s64>) = G_SPLAT_VECTOR %imm(s64)
27+
$z0 = COPY %splat(<vscale x 2 x s64>)
28+
...
29+
---
30+
name: test_splat_vector_s64_const
31+
body: |
32+
bb.1:
33+
; CHECK-SELECT-LABEL: name: test_splat_vector_s64_const
34+
; CHECK-SELECT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 9
35+
; CHECK-SELECT-NEXT: %imm:gpr64sp = SUBREG_TO_REG 0, [[MOVi32imm]], %subreg.sub_32
36+
; CHECK-SELECT-NEXT: %splat:zpr = DUP_ZR_D %imm
37+
; CHECK-SELECT-NEXT: $z0 = COPY %splat
38+
;
39+
; CHECK-REGBANK-LABEL: name: test_splat_vector_s64_const
40+
; CHECK-REGBANK: %imm:gpr(s64) = G_CONSTANT i64 9
41+
; CHECK-REGBANK-NEXT: %splat:fpr(<vscale x 2 x s64>) = G_SPLAT_VECTOR %imm(s64)
42+
; CHECK-REGBANK-NEXT: $z0 = COPY %splat(<vscale x 2 x s64>)
43+
;
44+
; CHECK-LEGAL-LABEL: name: test_splat_vector_s64_const
45+
; CHECK-LEGAL: %imm:_(s64) = G_CONSTANT i64 9
46+
; CHECK-LEGAL-NEXT: %splat:_(<vscale x 2 x s64>) = G_SPLAT_VECTOR %imm(s64)
47+
; CHECK-LEGAL-NEXT: $z0 = COPY %splat(<vscale x 2 x s64>)
48+
%imm:_(s64) = G_CONSTANT i64 9
49+
%splat:_(<vscale x 2 x s64>) = G_SPLAT_VECTOR %imm(s64)
50+
$z0 = COPY %splat(<vscale x 2 x s64>)
51+
...
52+
---
53+
name: test_splat_vector_s64_fconst
54+
body: |
55+
bb.1:
56+
; CHECK-SELECT-LABEL: name: test_splat_vector_s64_fconst
57+
; CHECK-SELECT: %imm:fpr64 = FMOVDi 34
58+
; CHECK-SELECT-NEXT: [[COPY:%[0-9]+]]:gpr64sp = COPY %imm
59+
; CHECK-SELECT-NEXT: %splat:zpr = DUP_ZR_D [[COPY]]
60+
; CHECK-SELECT-NEXT: $z0 = COPY %splat
61+
;
62+
; CHECK-REGBANK-LABEL: name: test_splat_vector_s64_fconst
63+
; CHECK-REGBANK: %imm:fpr(s64) = G_FCONSTANT double 9.000000e+00
64+
; CHECK-REGBANK-NEXT: [[COPY:%[0-9]+]]:gpr(s64) = COPY %imm(s64)
65+
; CHECK-REGBANK-NEXT: %splat:fpr(<vscale x 2 x s64>) = G_SPLAT_VECTOR [[COPY]](s64)
66+
; CHECK-REGBANK-NEXT: $z0 = COPY %splat(<vscale x 2 x s64>)
67+
;
68+
; CHECK-LEGAL-LABEL: name: test_splat_vector_s64_fconst
69+
; CHECK-LEGAL: %imm:_(s64) = G_FCONSTANT double 9.000000e+00
70+
; CHECK-LEGAL-NEXT: %splat:_(<vscale x 2 x s64>) = G_SPLAT_VECTOR %imm(s64)
71+
; CHECK-LEGAL-NEXT: $z0 = COPY %splat(<vscale x 2 x s64>)
72+
%imm:_(s64) = G_FCONSTANT double 9.0
73+
%splat:_(<vscale x 2 x s64>) = G_SPLAT_VECTOR %imm(s64)
74+
$z0 = COPY %splat(<vscale x 2 x s64>)
75+
...
76+
---
77+
name: test_splat_vector_s32
78+
body: |
79+
bb.1:
80+
; CHECK-SELECT-LABEL: name: test_splat_vector_s32
81+
; CHECK-SELECT: %imm:gpr32sp = COPY $w0
82+
; CHECK-SELECT-NEXT: %splat:zpr = DUP_ZR_S %imm
83+
; CHECK-SELECT-NEXT: $z0 = COPY %splat
84+
;
85+
; CHECK-REGBANK-LABEL: name: test_splat_vector_s32
86+
; CHECK-REGBANK: %imm:gpr(s32) = COPY $w0
87+
; CHECK-REGBANK-NEXT: %splat:fpr(<vscale x 4 x s32>) = G_SPLAT_VECTOR %imm(s32)
88+
; CHECK-REGBANK-NEXT: $z0 = COPY %splat(<vscale x 4 x s32>)
89+
;
90+
; CHECK-LEGAL-LABEL: name: test_splat_vector_s32
91+
; CHECK-LEGAL: %imm:_(s32) = COPY $w0
92+
; CHECK-LEGAL-NEXT: %splat:_(<vscale x 4 x s32>) = G_SPLAT_VECTOR %imm(s32)
93+
; CHECK-LEGAL-NEXT: $z0 = COPY %splat(<vscale x 4 x s32>)
94+
%imm:_(s32) = COPY $w0
95+
%splat:_(<vscale x 4 x s32>) = G_SPLAT_VECTOR %imm(s32)
96+
$z0 = COPY %splat(<vscale x 4 x s32>)
97+
...
98+
---
99+
name: test_splat_vector_s32_const
100+
body: |
101+
bb.1:
102+
; CHECK-SELECT-LABEL: name: test_splat_vector_s32_const
103+
; CHECK-SELECT: %imm:gpr32common = MOVi32imm 9
104+
; CHECK-SELECT-NEXT: %splat:zpr = DUP_ZR_S %imm
105+
; CHECK-SELECT-NEXT: $z0 = COPY %splat
106+
;
107+
; CHECK-REGBANK-LABEL: name: test_splat_vector_s32_const
108+
; CHECK-REGBANK: %imm:gpr(s32) = G_CONSTANT i32 9
109+
; CHECK-REGBANK-NEXT: %splat:fpr(<vscale x 4 x s32>) = G_SPLAT_VECTOR %imm(s32)
110+
; CHECK-REGBANK-NEXT: $z0 = COPY %splat(<vscale x 4 x s32>)
111+
;
112+
; CHECK-LEGAL-LABEL: name: test_splat_vector_s32_const
113+
; CHECK-LEGAL: %imm:_(s32) = G_CONSTANT i32 9
114+
; CHECK-LEGAL-NEXT: %splat:_(<vscale x 4 x s32>) = G_SPLAT_VECTOR %imm(s32)
115+
; CHECK-LEGAL-NEXT: $z0 = COPY %splat(<vscale x 4 x s32>)
116+
%imm:_(s32) = G_CONSTANT i32 9
117+
%splat:_(<vscale x 4 x s32>) = G_SPLAT_VECTOR %imm(s32)
118+
$z0 = COPY %splat(<vscale x 4 x s32>)
119+
...
120+
---
121+
name: test_splat_vector_s32_fconst
122+
body: |
123+
bb.1:
124+
; CHECK-SELECT-LABEL: name: test_splat_vector_s32_fconst
125+
; CHECK-SELECT: %imm:fpr32 = FMOVSi 28
126+
; CHECK-SELECT-NEXT: [[COPY:%[0-9]+]]:gpr32sp = COPY %imm
127+
; CHECK-SELECT-NEXT: %splat:zpr = DUP_ZR_S [[COPY]]
128+
; CHECK-SELECT-NEXT: $z0 = COPY %splat
129+
;
130+
; CHECK-REGBANK-LABEL: name: test_splat_vector_s32_fconst
131+
; CHECK-REGBANK: %imm:fpr(s32) = G_FCONSTANT float 7.000000e+00
132+
; CHECK-REGBANK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY %imm(s32)
133+
; CHECK-REGBANK-NEXT: %splat:fpr(<vscale x 4 x s32>) = G_SPLAT_VECTOR [[COPY]](s32)
134+
; CHECK-REGBANK-NEXT: $z0 = COPY %splat(<vscale x 4 x s32>)
135+
;
136+
; CHECK-LEGAL-LABEL: name: test_splat_vector_s32_fconst
137+
; CHECK-LEGAL: %imm:_(s32) = G_FCONSTANT float 7.000000e+00
138+
; CHECK-LEGAL-NEXT: %splat:_(<vscale x 4 x s32>) = G_SPLAT_VECTOR %imm(s32)
139+
; CHECK-LEGAL-NEXT: $z0 = COPY %splat(<vscale x 4 x s32>)
140+
%imm:_(s32) = G_FCONSTANT float 7.0
141+
%splat:_(<vscale x 4 x s32>) = G_SPLAT_VECTOR %imm(s32)
142+
$z0 = COPY %splat(<vscale x 4 x s32>)
143+
...

0 commit comments

Comments
 (0)