Skip to content

Commit 15db1e6

Browse files
committed
[AArch64][GlobalISel] Legalize G_LOAD for v4s8 vector type
1 parent 06f775a commit 15db1e6

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,14 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
388388
.clampMaxNumElements(0, s32, 4)
389389
.clampMaxNumElements(0, s64, 2)
390390
.clampMaxNumElements(0, p0, 2)
391+
// TODO: Use BITCAST for v2i8, v2i16 after G_TRUNC gets sorted out
392+
.bitcastIf(typeInSet(0, {v4s8}),
393+
[=](const LegalityQuery &Query) {
394+
const LLT VecTy = Query.Types[0];
395+
return std::pair(0, LLT::scalar(VecTy.getSizeInBits()));
396+
})
391397
.customIf(IsPtrVecPred)
392-
.scalarizeIf(typeIs(0, v2s16), 0);
398+
.scalarizeIf(typeInSet(0, {v2s16, v2s8}), 0);
393399

394400
getActionDefinitionsBuilder(G_STORE)
395401
.customIf([=](const LegalityQuery &Query) {

llvm/test/CodeGen/AArch64/load.ll

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
22
; RUN: llc -mtriple=aarch64-none-linux-gnu %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3-
; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4-
5-
; CHECK-GI: warning: Instruction selection used fallback path for load_v2i8
6-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for load_v4i8
3+
; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
74

85
; ===== Legal Scalars =====
96

@@ -111,13 +108,21 @@ define <2 x i64> @load_v2i64(ptr %ptr){
111108
; ===== Smaller/Larger Width Vectors with Legal Element Sizes =====
112109

113110
define <2 x i8> @load_v2i8(ptr %ptr, <2 x i8> %b){
114-
; CHECK-LABEL: load_v2i8:
115-
; CHECK: // %bb.0:
116-
; CHECK-NEXT: ld1 { v0.b }[0], [x0]
117-
; CHECK-NEXT: add x8, x0, #1
118-
; CHECK-NEXT: ld1 { v0.b }[4], [x8]
119-
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
120-
; CHECK-NEXT: ret
111+
; CHECK-SD-LABEL: load_v2i8:
112+
; CHECK-SD: // %bb.0:
113+
; CHECK-SD-NEXT: ld1 { v0.b }[0], [x0]
114+
; CHECK-SD-NEXT: add x8, x0, #1
115+
; CHECK-SD-NEXT: ld1 { v0.b }[4], [x8]
116+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
117+
; CHECK-SD-NEXT: ret
118+
;
119+
; CHECK-GI-LABEL: load_v2i8:
120+
; CHECK-GI: // %bb.0:
121+
; CHECK-GI-NEXT: ldr b0, [x0]
122+
; CHECK-GI-NEXT: ldr b1, [x0, #1]
123+
; CHECK-GI-NEXT: mov v0.s[1], v1.s[0]
124+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
125+
; CHECK-GI-NEXT: ret
121126
%a = load <2 x i8>, ptr %ptr
122127
ret <2 x i8> %a
123128
}

0 commit comments

Comments
 (0)