Skip to content

Commit 58e6d02

Browse files
[AArch64][GlobalISel] Check unmergeSrc is a vector in matchCombineBuildUnmerge (#168692)
This aims to fix the crash in #168495, my combine rule was missing a check that the source vector was in fact a vector. This then caused the legality check to fail in this example as the concat was trying to concat a non vector. I have also gated the bitcast of the concat to only work on non-scalable vectors as the mutation calls `getNumElements` which crashes when called on a scalable vector. Fixes #168495
1 parent 5343dd9 commit 58e6d02

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3499,6 +3499,9 @@ bool CombinerHelper::matchCombineBuildUnmerge(MachineInstr &MI,
34993499
LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
35003500
LLT UnmergeSrcTy = MRI.getType(UnmergeSrc);
35013501

3502+
if (!UnmergeSrcTy.isVector())
3503+
return false;
3504+
35023505
// Ensure we only generate legal instructions post-legalizer
35033506
if (!IsPreLegalize &&
35043507
!isLegal({TargetOpcode::G_CONCAT_VECTORS, {DstTy, UnmergeSrcTy}}))

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1242,7 +1242,9 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
12421242
.legalFor({{v16s8, v8s8}, {v8s16, v4s16}, {v4s32, v2s32}})
12431243
.bitcastIf(
12441244
[=](const LegalityQuery &Query) {
1245-
return Query.Types[0].getSizeInBits() <= 128 &&
1245+
return Query.Types[0].isFixedVector() &&
1246+
Query.Types[1].isFixedVector() &&
1247+
Query.Types[0].getSizeInBits() <= 128 &&
12461248
Query.Types[1].getSizeInBits() <= 64;
12471249
},
12481250
[=](const LegalityQuery &Query) {
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
2+
# RUN: llc -o - -mtriple=aarch64 -run-pass=aarch64-postlegalizer-combiner -verify-machineinstrs %s | FileCheck %s
3+
---
4+
name: non-vector-src
5+
legalized: true
6+
body: |
7+
bb.0:
8+
liveins: $w0
9+
10+
; CHECK-LABEL: name: non-vector-src
11+
; CHECK: liveins: $w0
12+
; CHECK-NEXT: {{ $}}
13+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
14+
; CHECK-NEXT: [[UV:%[0-9]+]]:_(s8), [[UV1:%[0-9]+]]:_(s8), [[UV2:%[0-9]+]]:_(s8), [[UV3:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[COPY]](s32)
15+
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s8) = G_IMPLICIT_DEF
16+
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<8 x s8>) = G_BUILD_VECTOR [[UV]](s8), [[UV1]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8)
17+
; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(<8 x s8>) = G_IMPLICIT_DEF
18+
; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<8 x s8>) = G_SHUFFLE_VECTOR [[BUILD_VECTOR]](<8 x s8>), [[DEF1]], shufflemask(1, 0, 1, 0, undef, undef, undef, undef)
19+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(<8 x s16>) = G_ANYEXT [[SHUF]](<8 x s8>)
20+
; CHECK-NEXT: [[UV4:%[0-9]+]]:_(<4 x s16>), [[UV5:%[0-9]+]]:_(<4 x s16>) = G_UNMERGE_VALUES [[ANYEXT]](<8 x s16>)
21+
; CHECK-NEXT: $d0 = COPY [[UV4]](<4 x s16>)
22+
; CHECK-NEXT: RET_ReallyLR implicit $d0
23+
%1:_(s32) = COPY $w0
24+
%30:_(s8), %31:_(s8), %32:_(s8), %33:_(s8) = G_UNMERGE_VALUES %1(s32)
25+
%14:_(s8) = G_IMPLICIT_DEF
26+
%15:_(<8 x s8>) = G_BUILD_VECTOR %30(s8), %31(s8), %14(s8), %14(s8), %14(s8), %14(s8), %14(s8), %14(s8)
27+
%20:_(<8 x s8>) = G_BUILD_VECTOR %14(s8), %14(s8), %14(s8), %14(s8), %14(s8), %14(s8), %14(s8), %14(s8)
28+
%21:_(<8 x s8>) = G_SHUFFLE_VECTOR %15(<8 x s8>), %20, shufflemask(1, 0, 1, 0, undef, undef, undef, undef)
29+
%41:_(<8 x s16>) = G_ANYEXT %21(<8 x s8>)
30+
%50:_(<4 x s16>), %51:_(<4 x s16>) = G_UNMERGE_VALUES %41(<8 x s16>)
31+
$d0 = COPY %50(<4 x s16>)
32+
RET_ReallyLR implicit $d0
33+
...
34+
---
35+
name: v2-src
36+
legalized: true
37+
body: |
38+
bb.0:
39+
liveins: $q0
40+
41+
; CHECK-LABEL: name: v2-src
42+
; CHECK: liveins: $q0
43+
; CHECK-NEXT: {{ $}}
44+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $x0
45+
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<2 x s32>) = G_IMPLICIT_DEF
46+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s32>) = G_CONCAT_VECTORS [[COPY]](<2 x s32>), [[DEF]](<2 x s32>)
47+
; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<4 x s32>)
48+
%1:_(<2 x s32>) = COPY $x0
49+
%30:_(s32), %31:_(s32) = G_UNMERGE_VALUES %1(<2 x s32>)
50+
%14:_(s32) = G_IMPLICIT_DEF
51+
%15:_(<4 x s32>) = G_BUILD_VECTOR %30(s32), %31(s32), %14(s32), %14(s32)
52+
RET_ReallyLR implicit %15
53+
...
54+
---
55+
name: v4-src
56+
legalized: true
57+
body: |
58+
bb.0:
59+
liveins: $q0
60+
61+
; CHECK-LABEL: name: v4-src
62+
; CHECK: liveins: $q0
63+
; CHECK-NEXT: {{ $}}
64+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $x0
65+
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<4 x s16>) = G_IMPLICIT_DEF
66+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s16>) = G_CONCAT_VECTORS [[COPY]](<4 x s16>), [[DEF]](<4 x s16>)
67+
; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<8 x s16>)
68+
%1:_(<4 x s16>) = COPY $x0
69+
%30:_(s16), %31:_(s16), %32:_(s16), %33:_(s16) = G_UNMERGE_VALUES %1(<4 x s16>)
70+
%14:_(s16) = G_IMPLICIT_DEF
71+
%15:_(<8 x s16>) = G_BUILD_VECTOR %30(s16), %31(s16), %32(s16), %33(s16), %14(s16), %14(s16), %14(s16), %14(s16)
72+
RET_ReallyLR implicit %15

0 commit comments

Comments
 (0)