Skip to content

Commit eaf23b2

Browse files
authored
[GIsel][AArch64] Legalize <2 x i16> for G_INSERT_VECTOR_ELT (#65830)
Widen the vector elements to 64 bits to make sure it legal instead by clamping the number of elements. Depend on D153394. Fixes #63826
1 parent 7024892 commit eaf23b2

File tree

4 files changed

+119
-18
lines changed

4 files changed

+119
-18
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2496,6 +2496,17 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
24962496
return Legalized;
24972497
}
24982498
case TargetOpcode::G_INSERT_VECTOR_ELT: {
2499+
if (TypeIdx == 0) {
2500+
Observer.changingInstr(MI);
2501+
const LLT WideEltTy = WideTy.getElementType();
2502+
2503+
widenScalarSrc(MI, WideTy, 1, TargetOpcode::G_ANYEXT);
2504+
widenScalarSrc(MI, WideEltTy, 2, TargetOpcode::G_ANYEXT);
2505+
widenScalarDst(MI, WideTy, 0);
2506+
Observer.changedInstr(MI);
2507+
return Legalized;
2508+
}
2509+
24992510
if (TypeIdx == 1) {
25002511
Observer.changingInstr(MI);
25012512

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -732,8 +732,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
732732

733733
getActionDefinitionsBuilder(G_INSERT_VECTOR_ELT)
734734
.legalIf(typeInSet(0, {v16s8, v8s8, v8s16, v4s16, v4s32, v2s32, v2s64}))
735-
.clampMinNumElements(0, s16, 4)
736-
.clampMaxNumElements(0, s16, 8);
735+
.widenVectorEltsToVectorMinSize(0, 64);
737736

738737
getActionDefinitionsBuilder(G_BUILD_VECTOR)
739738
.legalFor({{v8s8, s8},
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -o - -verify-machineinstrs -global-isel=1 -global-isel-abort=1 | FileCheck %s --check-prefixes=CHECK
3+
; RUN: llc < %s -o - -verify-machineinstrs -global-isel=0 | FileCheck %s --check-prefixes=CHECK
4+
5+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
6+
target triple = "arm64-apple-ios14.5.0"
7+
8+
define <2 x i16> @pr63826_v2s16(<2 x i16> %vec) {
9+
; CHECK-LABEL: pr63826_v2s16:
10+
; CHECK: ; %bb.0:
11+
; CHECK-NEXT: ; kill: def $d0 killed $d0 def $q0
12+
; CHECK-NEXT: mov w8, #1 ; =0x1
13+
; CHECK-NEXT: mov.s v0[0], w8
14+
; CHECK-NEXT: ; kill: def $d0 killed $d0 killed $q0
15+
; CHECK-NEXT: ret
16+
%vec1 = insertelement <2 x i16> %vec, i16 1, i32 0
17+
ret <2 x i16> %vec1
18+
}
19+
20+
define <2 x i8> @pr63826_v2s8(<2 x i8> %vec) {
21+
; CHECK-LABEL: pr63826_v2s8:
22+
; CHECK: ; %bb.0:
23+
; CHECK-NEXT: ; kill: def $d0 killed $d0 def $q0
24+
; CHECK-NEXT: mov w8, #1 ; =0x1
25+
; CHECK-NEXT: mov.s v0[0], w8
26+
; CHECK-NEXT: ; kill: def $d0 killed $d0 killed $q0
27+
; CHECK-NEXT: ret
28+
%vec1 = insertelement <2 x i8> %vec, i8 1, i32 0
29+
ret <2 x i8> %vec1
30+
}
31+
32+
define <4 x i8> @pr63826_v4s8(<4 x i8> %vec) {
33+
; CHECK-LABEL: pr63826_v4s8:
34+
; CHECK: ; %bb.0:
35+
; CHECK-NEXT: ; kill: def $d0 killed $d0 def $q0
36+
; CHECK-NEXT: mov w8, #1 ; =0x1
37+
; CHECK-NEXT: mov.h v0[0], w8
38+
; CHECK-NEXT: ; kill: def $d0 killed $d0 killed $q0
39+
; CHECK-NEXT: ret
40+
%vec1 = insertelement <4 x i8> %vec, i8 1, i32 0
41+
ret <4 x i8> %vec1
42+
}

llvm/test/CodeGen/AArch64/GlobalISel/legalize-insert-vector-elt.mir

Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,73 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
22
# RUN: llc -mtriple=aarch64-linux-gnu -O0 -run-pass=legalizer %s -o - -global-isel-abort=1 | FileCheck %s
33
---
4-
name: pr63826
4+
name: pr63826_v2s16
55
body: |
66
bb.0:
7-
; CHECK-LABEL: name: pr63826
8-
; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $w0
9-
; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 1
10-
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 42
11-
; CHECK-NEXT: [[UV:%[0-9]+]]:_(s16), [[UV1:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[COPY]](<2 x s16>)
12-
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s16) = G_IMPLICIT_DEF
13-
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s16>) = G_BUILD_VECTOR [[UV]](s16), [[UV1]](s16), [[DEF]](s16), [[DEF]](s16)
14-
; CHECK-NEXT: [[IVEC:%[0-9]+]]:_(<4 x s16>) = G_INSERT_VECTOR_ELT [[BUILD_VECTOR]], [[C]](s16), [[C1]](s32)
15-
; CHECK-NEXT: [[UV2:%[0-9]+]]:_(<2 x s16>), [[UV3:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[IVEC]](<4 x s16>)
16-
; CHECK-NEXT: $w0 = COPY [[UV2]](<2 x s16>)
17-
%0:_(<2 x s16>) = COPY $w0
18-
%1:_(s16) = G_CONSTANT i16 1
19-
%2:_(s32) = G_CONSTANT i32 42
20-
%4:_(<2 x s16>) = G_INSERT_VECTOR_ELT %0(<2 x s16>), %1(s16), %2(s32)
21-
$w0 = COPY %4(<2 x s16>)
7+
liveins: $d0
8+
; CHECK-LABEL: name: pr63826_v2s16
9+
; CHECK: liveins: $d0
10+
; CHECK-NEXT: {{ $}}
11+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
12+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
13+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
14+
; CHECK-NEXT: [[IVEC:%[0-9]+]]:_(<2 x s32>) = G_INSERT_VECTOR_ELT [[COPY]], [[C1]](s32), [[C]](s32)
15+
; CHECK-NEXT: $d0 = COPY [[IVEC]](<2 x s32>)
16+
; CHECK-NEXT: RET_ReallyLR implicit $d0
17+
%1:_(<2 x s32>) = COPY $d0
18+
%0:_(<2 x s16>) = G_TRUNC %1(<2 x s32>)
19+
%4:_(s32) = G_CONSTANT i32 0
20+
%3:_(s16) = G_CONSTANT i16 1
21+
%2:_(<2 x s16>) = G_INSERT_VECTOR_ELT %0, %3(s16), %4(s32)
22+
%5:_(<2 x s32>) = G_ANYEXT %2(<2 x s16>)
23+
$d0 = COPY %5(<2 x s32>)
24+
RET_ReallyLR implicit $d0
25+
...
26+
---
27+
name: pr63826_v2s8
28+
body: |
29+
bb.0:
30+
liveins: $d0
31+
; CHECK-LABEL: name: pr63826_v2s8
32+
; CHECK: liveins: $d0
33+
; CHECK-NEXT: {{ $}}
34+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
35+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
36+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
37+
; CHECK-NEXT: [[IVEC:%[0-9]+]]:_(<2 x s32>) = G_INSERT_VECTOR_ELT [[COPY]], [[C1]](s32), [[C]](s32)
38+
; CHECK-NEXT: $d0 = COPY [[IVEC]](<2 x s32>)
39+
; CHECK-NEXT: RET_ReallyLR implicit $d0
40+
%1:_(<2 x s32>) = COPY $d0
41+
%0:_(<2 x s8>) = G_TRUNC %1(<2 x s32>)
42+
%4:_(s32) = G_CONSTANT i32 0
43+
%3:_(s8) = G_CONSTANT i8 1
44+
%2:_(<2 x s8>) = G_INSERT_VECTOR_ELT %0, %3(s8), %4(s32)
45+
%5:_(<2 x s32>) = G_ANYEXT %2(<2 x s8>)
46+
$d0 = COPY %5(<2 x s32>)
47+
RET_ReallyLR implicit $d0
48+
...
49+
---
50+
name: pr63826_v4s8
51+
body: |
52+
bb.0:
53+
liveins: $d0
54+
; CHECK-LABEL: name: pr63826_v4s8
55+
; CHECK: liveins: $d0
56+
; CHECK-NEXT: {{ $}}
57+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $d0
58+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
59+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s16) = G_CONSTANT i16 1
60+
; CHECK-NEXT: [[IVEC:%[0-9]+]]:_(<4 x s16>) = G_INSERT_VECTOR_ELT [[COPY]], [[C1]](s16), [[C]](s32)
61+
; CHECK-NEXT: $d0 = COPY [[IVEC]](<4 x s16>)
62+
; CHECK-NEXT: RET_ReallyLR implicit $d0
63+
%1:_(<4 x s16>) = COPY $d0
64+
%0:_(<4 x s8>) = G_TRUNC %1(<4 x s16>)
65+
%4:_(s32) = G_CONSTANT i32 0
66+
%3:_(s8) = G_CONSTANT i8 1
67+
%2:_(<4 x s8>) = G_INSERT_VECTOR_ELT %0, %3(s8), %4(s32)
68+
%5:_(<4 x s16>) = G_ANYEXT %2(<4 x s8>)
69+
$d0 = COPY %5(<4 x s16>)
70+
RET_ReallyLR implicit $d0
2271
...
2372
---
2473
name: v8s8

0 commit comments

Comments
 (0)