Skip to content

Commit 775de20

Browse files
authored
[RISCV][GISel] Support unaligned-scalar-mem. (#108905)
We need to set the required alignment to 8 with unaligned-scalar-mem. If we don't do this, the legalizer will try to lower the unaligned load/store and the lower code will call allowsMemoryAccess to verify what its supposed to do. allowsMemoryAccess will say the unaligned access is allowed. So the legalizer gives up.
1 parent b4a8e87 commit 775de20

File tree

5 files changed

+394
-28
lines changed

5 files changed

+394
-28
lines changed

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -287,34 +287,48 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
287287

288288
auto &LoadActions = getActionDefinitionsBuilder(G_LOAD);
289289
auto &StoreActions = getActionDefinitionsBuilder(G_STORE);
290+
auto &ExtLoadActions = getActionDefinitionsBuilder({G_SEXTLOAD, G_ZEXTLOAD});
290291

291-
LoadActions
292-
.legalForTypesWithMemDesc({{s32, p0, s8, 8},
293-
{s32, p0, s16, 16},
294-
{s32, p0, s32, 32},
295-
{p0, p0, sXLen, XLen}});
296-
StoreActions
297-
.legalForTypesWithMemDesc({{s32, p0, s8, 8},
298-
{s32, p0, s16, 16},
299-
{s32, p0, s32, 32},
300-
{p0, p0, sXLen, XLen}});
301-
auto &ExtLoadActions =
302-
getActionDefinitionsBuilder({G_SEXTLOAD, G_ZEXTLOAD})
303-
.legalForTypesWithMemDesc({{s32, p0, s8, 8}, {s32, p0, s16, 16}});
292+
// Return the alignment needed for scalar memory ops. If unaligned scalar mem
293+
// is supported, we only require byte alignment. Otherwise, we need the memory
294+
// op to be natively aligned.
295+
auto getScalarMemAlign = [&ST](unsigned Size) {
296+
return ST.enableUnalignedScalarMem() ? 8 : Size;
297+
};
298+
299+
LoadActions.legalForTypesWithMemDesc(
300+
{{s32, p0, s8, getScalarMemAlign(8)},
301+
{s32, p0, s16, getScalarMemAlign(16)},
302+
{s32, p0, s32, getScalarMemAlign(32)},
303+
{p0, p0, sXLen, getScalarMemAlign(XLen)}});
304+
StoreActions.legalForTypesWithMemDesc(
305+
{{s32, p0, s8, getScalarMemAlign(8)},
306+
{s32, p0, s16, getScalarMemAlign(16)},
307+
{s32, p0, s32, getScalarMemAlign(32)},
308+
{p0, p0, sXLen, getScalarMemAlign(XLen)}});
309+
ExtLoadActions.legalForTypesWithMemDesc(
310+
{{s32, p0, s8, getScalarMemAlign(8)},
311+
{s32, p0, s16, getScalarMemAlign(16)}});
304312
if (XLen == 64) {
305-
LoadActions.legalForTypesWithMemDesc({{s64, p0, s8, 8},
306-
{s64, p0, s16, 16},
307-
{s64, p0, s32, 32},
308-
{s64, p0, s64, 64}});
309-
StoreActions.legalForTypesWithMemDesc({{s64, p0, s8, 8},
310-
{s64, p0, s16, 16},
311-
{s64, p0, s32, 32},
312-
{s64, p0, s64, 64}});
313+
LoadActions.legalForTypesWithMemDesc(
314+
{{s64, p0, s8, getScalarMemAlign(8)},
315+
{s64, p0, s16, getScalarMemAlign(16)},
316+
{s64, p0, s32, getScalarMemAlign(32)},
317+
{s64, p0, s64, getScalarMemAlign(64)}});
318+
StoreActions.legalForTypesWithMemDesc(
319+
{{s64, p0, s8, getScalarMemAlign(8)},
320+
{s64, p0, s16, getScalarMemAlign(16)},
321+
{s64, p0, s32, getScalarMemAlign(32)},
322+
{s64, p0, s64, getScalarMemAlign(64)}});
313323
ExtLoadActions.legalForTypesWithMemDesc(
314-
{{s64, p0, s8, 8}, {s64, p0, s16, 16}, {s64, p0, s32, 32}});
324+
{{s64, p0, s8, getScalarMemAlign(8)},
325+
{s64, p0, s16, getScalarMemAlign(16)},
326+
{s64, p0, s32, getScalarMemAlign(32)}});
315327
} else if (ST.hasStdExtD()) {
316-
LoadActions.legalForTypesWithMemDesc({{s64, p0, s64, 64}});
317-
StoreActions.legalForTypesWithMemDesc({{s64, p0, s64, 64}});
328+
LoadActions.legalForTypesWithMemDesc(
329+
{{s64, p0, s64, getScalarMemAlign(64)}});
330+
StoreActions.legalForTypesWithMemDesc(
331+
{{s64, p0, s64, getScalarMemAlign(64)}});
318332
}
319333

320334
// Vector loads/stores.

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-load-rv32.mir

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
22
# RUN: llc -mtriple=riscv32 -run-pass=legalizer %s -o - \
3-
# RUN: | FileCheck %s
3+
# RUN: | FileCheck %s
4+
# RUN: llc -mtriple=riscv32 -mattr=+unaligned-scalar-mem -run-pass=legalizer %s -o - \
5+
# RUN: | FileCheck %s --check-prefix=UNALIGNED
46

57
---
68
name: load_i8
@@ -26,6 +28,14 @@ body: |
2628
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s8))
2729
; CHECK-NEXT: $x10 = COPY [[LOAD]](s32)
2830
; CHECK-NEXT: PseudoRET implicit $x10
31+
;
32+
; UNALIGNED-LABEL: name: load_i8
33+
; UNALIGNED: liveins: $x10
34+
; UNALIGNED-NEXT: {{ $}}
35+
; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
36+
; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s8))
37+
; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
38+
; UNALIGNED-NEXT: PseudoRET implicit $x10
2939
%0:_(p0) = COPY $x10
3040
%1:_(s8) = G_LOAD %0(p0) :: (load (s8))
3141
%2:_(s32) = G_ANYEXT %1(s8)
@@ -57,6 +67,14 @@ body: |
5767
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s16))
5868
; CHECK-NEXT: $x10 = COPY [[LOAD]](s32)
5969
; CHECK-NEXT: PseudoRET implicit $x10
70+
;
71+
; UNALIGNED-LABEL: name: load_i16
72+
; UNALIGNED: liveins: $x10
73+
; UNALIGNED-NEXT: {{ $}}
74+
; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
75+
; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s16))
76+
; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
77+
; UNALIGNED-NEXT: PseudoRET implicit $x10
6078
%0:_(p0) = COPY $x10
6179
%1:_(s16) = G_LOAD %0(p0) :: (load (s16))
6280
%2:_(s32) = G_ANYEXT %1(s16)
@@ -87,6 +105,14 @@ body: |
87105
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
88106
; CHECK-NEXT: $x10 = COPY [[LOAD]](s32)
89107
; CHECK-NEXT: PseudoRET implicit $x10
108+
;
109+
; UNALIGNED-LABEL: name: load_i32
110+
; UNALIGNED: liveins: $x10
111+
; UNALIGNED-NEXT: {{ $}}
112+
; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
113+
; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
114+
; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
115+
; UNALIGNED-NEXT: PseudoRET implicit $x10
90116
%0:_(p0) = COPY $x10
91117
%1:_(s32) = G_LOAD %0(p0) :: (load (s32))
92118
$x10 = COPY %1(s32)
@@ -122,6 +148,18 @@ body: |
122148
; CHECK-NEXT: $x10 = COPY [[LOAD]](s32)
123149
; CHECK-NEXT: $x11 = COPY [[LOAD1]](s32)
124150
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
151+
;
152+
; UNALIGNED-LABEL: name: load_i64
153+
; UNALIGNED: liveins: $x10
154+
; UNALIGNED-NEXT: {{ $}}
155+
; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
156+
; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32), align 8)
157+
; UNALIGNED-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 4
158+
; UNALIGNED-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)
159+
; UNALIGNED-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD]](p0) :: (load (s32) from unknown-address + 4)
160+
; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
161+
; UNALIGNED-NEXT: $x11 = COPY [[LOAD1]](s32)
162+
; UNALIGNED-NEXT: PseudoRET implicit $x10, implicit $x11
125163
%0:_(p0) = COPY $x10
126164
%1:_(s64) = G_LOAD %0(p0) :: (load (s64))
127165
%2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %1(s64)
@@ -153,6 +191,14 @@ body: |
153191
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[COPY]](p0) :: (load (p0), align 8)
154192
; CHECK-NEXT: $x10 = COPY [[LOAD]](p0)
155193
; CHECK-NEXT: PseudoRET implicit $x10
194+
;
195+
; UNALIGNED-LABEL: name: load_ptr
196+
; UNALIGNED: liveins: $x10
197+
; UNALIGNED-NEXT: {{ $}}
198+
; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
199+
; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[COPY]](p0) :: (load (p0), align 8)
200+
; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](p0)
201+
; UNALIGNED-NEXT: PseudoRET implicit $x10
156202
%0:_(p0) = COPY $x10
157203
%1:_(p0) = G_LOAD %0(p0) :: (load (p0), align 8)
158204
$x10 = COPY %1(p0)
@@ -189,6 +235,14 @@ body: |
189235
; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[SHL]], [[ZEXTLOAD]]
190236
; CHECK-NEXT: $x10 = COPY [[OR]](s32)
191237
; CHECK-NEXT: PseudoRET implicit $x10
238+
;
239+
; UNALIGNED-LABEL: name: load_i16_unaligned
240+
; UNALIGNED: liveins: $x10
241+
; UNALIGNED-NEXT: {{ $}}
242+
; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
243+
; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s16), align 1)
244+
; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
245+
; UNALIGNED-NEXT: PseudoRET implicit $x10
192246
%0:_(p0) = COPY $x10
193247
%1:_(s16) = G_LOAD %0(p0) :: (load (s16), align 1)
194248
%2:_(s32) = G_ANYEXT %1(s16)
@@ -237,6 +291,14 @@ body: |
237291
; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s32) = G_OR [[SHL2]], [[OR]]
238292
; CHECK-NEXT: $x10 = COPY [[OR2]](s32)
239293
; CHECK-NEXT: PseudoRET implicit $x10
294+
;
295+
; UNALIGNED-LABEL: name: load_i32_unaligned
296+
; UNALIGNED: liveins: $x10
297+
; UNALIGNED-NEXT: {{ $}}
298+
; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
299+
; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32), align 1)
300+
; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
301+
; UNALIGNED-NEXT: PseudoRET implicit $x10
240302
%0:_(p0) = COPY $x10
241303
%1:_(s32) = G_LOAD %0(p0) :: (load (s32), align 1)
242304
$x10 = COPY %1(s32)
@@ -272,6 +334,14 @@ body: |
272334
; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[SHL]], [[ZEXTLOAD]]
273335
; CHECK-NEXT: $x10 = COPY [[OR]](s32)
274336
; CHECK-NEXT: PseudoRET implicit $x10
337+
;
338+
; UNALIGNED-LABEL: name: load_i32_align2
339+
; UNALIGNED: liveins: $x10
340+
; UNALIGNED-NEXT: {{ $}}
341+
; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
342+
; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32), align 2)
343+
; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
344+
; UNALIGNED-NEXT: PseudoRET implicit $x10
275345
%0:_(p0) = COPY $x10
276346
%1:_(s32) = G_LOAD %0(p0) :: (load (s32), align 2)
277347
$x10 = COPY %1(s32)
@@ -343,6 +413,18 @@ body: |
343413
; CHECK-NEXT: $x10 = COPY [[OR2]](s32)
344414
; CHECK-NEXT: $x11 = COPY [[OR5]](s32)
345415
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
416+
;
417+
; UNALIGNED-LABEL: name: load_i64_unaligned
418+
; UNALIGNED: liveins: $x10
419+
; UNALIGNED-NEXT: {{ $}}
420+
; UNALIGNED-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
421+
; UNALIGNED-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32), align 1)
422+
; UNALIGNED-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 4
423+
; UNALIGNED-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)
424+
; UNALIGNED-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD]](p0) :: (load (s32) from unknown-address + 4, align 1)
425+
; UNALIGNED-NEXT: $x10 = COPY [[LOAD]](s32)
426+
; UNALIGNED-NEXT: $x11 = COPY [[LOAD1]](s32)
427+
; UNALIGNED-NEXT: PseudoRET implicit $x10, implicit $x11
346428
%0:_(p0) = COPY $x10
347429
%1:_(s64) = G_LOAD %0(p0) :: (load (s64), align 1)
348430
%2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %1(s64)

0 commit comments

Comments
 (0)