Skip to content

Commit 426f39c

Browse files
authored
Merge pull request #10597 from tobias-stadler/swift-0b5daeb
[GlobalISel] Fix miscompile when narrowing vector loads/stores to non-byte-sized types (llvm#136739) rdar://118399919
2 parents b85f846 + 4174df6 commit 426f39c

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4615,6 +4615,11 @@ LegalizerHelper::reduceLoadStoreWidth(GLoadStore &LdStMI, unsigned TypeIdx,
46154615
if (TypeIdx != 0)
46164616
return UnableToLegalize;
46174617

4618+
if (!NarrowTy.isByteSized()) {
4619+
LLVM_DEBUG(dbgs() << "Can't narrow load/store to non-byte-sized type\n");
4620+
return UnableToLegalize;
4621+
}
4622+
46184623
// This implementation doesn't work for atomics. Give up instead of doing
46194624
// something invalid.
46204625
if (LdStMI.isAtomic())
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -O0 -mtriple=aarch64 -verify-machineinstrs -run-pass=legalizer -global-isel-abort=0 -pass-remarks-missed='gisel.*' -o - %s 2> %t.err | FileCheck %s
3+
# RUN: FileCheck -check-prefix=ERR %s < %t.err
4+
5+
# ERR: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %{{[0-9]+}}:_(<8 x s9>), %{{[0-9]+}}:_(p0) :: (store (<8 x s9>), align 16) (in function: store-narrow-non-byte-sized-s9)
6+
# ERR-NEXT: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %{{[0-9]+}}:_(<40 x s1>), %{{[0-9]+}}:_(p0) :: (store (<40 x s1>), align 8) (in function: store-narrow-non-byte-sized-s1)
7+
# ERR-NEXT: remark: <unknown>:0:0: unable to legalize instruction: %{{[0-9]+}}:_(<8 x s9>) = G_LOAD %{{[0-9]+}}:_(p0) :: (load (<8 x s9>), align 16) (in function: load-narrow-non-byte-sized-s9)
8+
# ERR-NEXT: remark: <unknown>:0:0: unable to legalize instruction: %{{[0-9]+}}:_(<40 x s1>) = G_LOAD %{{[0-9]+}}:_(p0) :: (load (<40 x s1>), align 8) (in function: load-narrow-non-byte-sized-s1)
9+
10+
# FIXME: Non-byte-sized vector elements cause fallback in LegalizerHelper::reduceLoadStoreWidth
11+
---
12+
name: store-narrow-non-byte-sized-s9
13+
tracksRegLiveness: true
14+
body: |
15+
bb.1:
16+
liveins: $x8
17+
; CHECK-LABEL: name: store-narrow-non-byte-sized-s9
18+
; CHECK: liveins: $x8
19+
; CHECK-NEXT: {{ $}}
20+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x8
21+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s9) = G_CONSTANT i9 -256
22+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s9) = G_CONSTANT i9 -255
23+
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<8 x s9>) = G_BUILD_VECTOR [[C]](s9), [[C1]](s9), [[C]](s9), [[C1]](s9), [[C]](s9), [[C1]](s9), [[C]](s9), [[C1]](s9)
24+
; CHECK-NEXT: G_STORE [[BUILD_VECTOR]](<8 x s9>), [[COPY]](p0) :: (store (<8 x s9>), align 16)
25+
; CHECK-NEXT: RET_ReallyLR
26+
%0:_(p0) = COPY $x8
27+
%1:_(s9) = G_CONSTANT i9 256
28+
%2:_(s9) = G_CONSTANT i9 257
29+
%3:_(<8 x s9>) = G_BUILD_VECTOR %1(s9), %2(s9), %1(s9), %2(s9), %1(s9), %2(s9), %1(s9), %2(s9)
30+
G_STORE %3(<8 x s9>), %0(p0) :: (store (<8 x s9>), align 16)
31+
RET_ReallyLR
32+
...
33+
---
34+
name: store-narrow-non-byte-sized-s1
35+
tracksRegLiveness: true
36+
body: |
37+
bb.1:
38+
liveins: $x8
39+
; CHECK-LABEL: name: store-narrow-non-byte-sized-s1
40+
; CHECK: liveins: $x8
41+
; CHECK-NEXT: {{ $}}
42+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x8
43+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 false
44+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
45+
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<40 x s1>) = G_BUILD_VECTOR [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1), [[C]](s1), [[C1]](s1)
46+
; CHECK-NEXT: G_STORE [[BUILD_VECTOR]](<40 x s1>), [[COPY]](p0) :: (store (<40 x s1>), align 8)
47+
; CHECK-NEXT: RET_ReallyLR
48+
%0:_(p0) = COPY $x8
49+
%1:_(s1) = G_CONSTANT i1 0
50+
%2:_(s1) = G_CONSTANT i1 1
51+
%3:_(<40 x s1>) = G_BUILD_VECTOR %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1), %1(s1), %2(s1)
52+
G_STORE %3(<40 x s1>), %0(p0) :: (store (<40 x s1>), align 8)
53+
RET_ReallyLR
54+
...
55+
56+
# FIXME: Non-byte-sized vector elements cause fallback in LegalizerHelper::reduceLoadStoreWidth
57+
---
58+
name: load-narrow-non-byte-sized-s9
59+
tracksRegLiveness: true
60+
body: |
61+
bb.1:
62+
liveins: $x8
63+
; CHECK-LABEL: name: load-narrow-non-byte-sized-s9
64+
; CHECK: liveins: $x8
65+
; CHECK-NEXT: {{ $}}
66+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x8
67+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(<8 x s9>) = G_LOAD [[COPY]](p0) :: (load (<8 x s9>), align 16)
68+
; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(<8 x s16>) = G_ZEXT [[LOAD]](<8 x s9>)
69+
; CHECK-NEXT: $q0 = COPY [[ZEXT]](<8 x s16>)
70+
; CHECK-NEXT: RET_ReallyLR implicit $q0
71+
%0:_(p0) = COPY $x8
72+
%2:_(<8 x s9>) = G_LOAD %0(p0) :: (load (<8 x s9>), align 16)
73+
%3:_(<8 x s16>) = G_ZEXT %2(<8 x s9>)
74+
$q0 = COPY %3(<8 x s16>)
75+
RET_ReallyLR implicit $q0
76+
...
77+
---
78+
name: load-narrow-non-byte-sized-s1
79+
tracksRegLiveness: true
80+
body: |
81+
bb.1:
82+
liveins: $x8
83+
; CHECK-LABEL: name: load-narrow-non-byte-sized-s1
84+
; CHECK: liveins: $x8
85+
; CHECK-NEXT: {{ $}}
86+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x8
87+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(<40 x s1>) = G_LOAD [[COPY]](p0) :: (load (<40 x s1>), align 8)
88+
; CHECK-NEXT: [[UV:%[0-9]+]]:_(s1), [[UV1:%[0-9]+]]:_(s1), [[UV2:%[0-9]+]]:_(s1), [[UV3:%[0-9]+]]:_(s1), [[UV4:%[0-9]+]]:_(s1), [[UV5:%[0-9]+]]:_(s1), [[UV6:%[0-9]+]]:_(s1), [[UV7:%[0-9]+]]:_(s1), [[UV8:%[0-9]+]]:_(s1), [[UV9:%[0-9]+]]:_(s1), [[UV10:%[0-9]+]]:_(s1), [[UV11:%[0-9]+]]:_(s1), [[UV12:%[0-9]+]]:_(s1), [[UV13:%[0-9]+]]:_(s1), [[UV14:%[0-9]+]]:_(s1), [[UV15:%[0-9]+]]:_(s1), [[UV16:%[0-9]+]]:_(s1), [[UV17:%[0-9]+]]:_(s1), [[UV18:%[0-9]+]]:_(s1), [[UV19:%[0-9]+]]:_(s1), [[UV20:%[0-9]+]]:_(s1), [[UV21:%[0-9]+]]:_(s1), [[UV22:%[0-9]+]]:_(s1), [[UV23:%[0-9]+]]:_(s1), [[UV24:%[0-9]+]]:_(s1), [[UV25:%[0-9]+]]:_(s1), [[UV26:%[0-9]+]]:_(s1), [[UV27:%[0-9]+]]:_(s1), [[UV28:%[0-9]+]]:_(s1), [[UV29:%[0-9]+]]:_(s1), [[UV30:%[0-9]+]]:_(s1), [[UV31:%[0-9]+]]:_(s1), [[UV32:%[0-9]+]]:_(s1), [[UV33:%[0-9]+]]:_(s1), [[UV34:%[0-9]+]]:_(s1), [[UV35:%[0-9]+]]:_(s1), [[UV36:%[0-9]+]]:_(s1), [[UV37:%[0-9]+]]:_(s1), [[UV38:%[0-9]+]]:_(s1), [[UV39:%[0-9]+]]:_(s1) = G_UNMERGE_VALUES [[LOAD]](<40 x s1>)
89+
; CHECK-NEXT: [[MV:%[0-9]+]]:_(s40) = G_MERGE_VALUES [[UV]](s1), [[UV1]](s1), [[UV2]](s1), [[UV3]](s1), [[UV4]](s1), [[UV5]](s1), [[UV6]](s1), [[UV7]](s1), [[UV8]](s1), [[UV9]](s1), [[UV10]](s1), [[UV11]](s1), [[UV12]](s1), [[UV13]](s1), [[UV14]](s1), [[UV15]](s1), [[UV16]](s1), [[UV17]](s1), [[UV18]](s1), [[UV19]](s1), [[UV20]](s1), [[UV21]](s1), [[UV22]](s1), [[UV23]](s1), [[UV24]](s1), [[UV25]](s1), [[UV26]](s1), [[UV27]](s1), [[UV28]](s1), [[UV29]](s1), [[UV30]](s1), [[UV31]](s1), [[UV32]](s1), [[UV33]](s1), [[UV34]](s1), [[UV35]](s1), [[UV36]](s1), [[UV37]](s1), [[UV38]](s1), [[UV39]](s1)
90+
; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[MV]](s40)
91+
; CHECK-NEXT: $x0 = COPY [[ZEXT]](s64)
92+
; CHECK-NEXT: RET_ReallyLR implicit $x0
93+
%0:_(p0) = COPY $x8
94+
%1:_(<40 x s1>) = G_LOAD %0:_(p0) :: (load (<40 x s1>), align 8)
95+
%2:_(s40) = G_BITCAST %1:_(<40 x s1>)
96+
%3:_(s64) = G_ZEXT %2(s40)
97+
$x0 = COPY %3(s64)
98+
RET_ReallyLR implicit $x0
99+
...

0 commit comments

Comments
 (0)