Skip to content

Commit 878b42a

Browse files
author
Volkan Keles
committed
[GlobalISel] LegalizerHelper: Implement fewerElementsVector for G_LOAD/G_STORE
Reviewers: aemerson, dsanders, bogner, paquette, aditya_nandakumar Reviewed By: dsanders Subscribers: rovka, kristof.beyls, javed.absar, tschuett, llvm-commits Differential Revision: https://reviews.llvm.org/D53728 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349200 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent cba44d9 commit 878b42a

File tree

3 files changed

+98
-41
lines changed

3 files changed

+98
-41
lines changed

lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,8 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
11281128
// FIXME: Don't know how to handle secondary types yet.
11291129
if (TypeIdx != 0)
11301130
return UnableToLegalize;
1131+
1132+
MIRBuilder.setInstr(MI);
11311133
switch (MI.getOpcode()) {
11321134
default:
11331135
return UnableToLegalize;
@@ -1141,8 +1143,6 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
11411143
if (Size % NarrowSize != 0)
11421144
return UnableToLegalize;
11431145

1144-
MIRBuilder.setInstr(MI);
1145-
11461146
SmallVector<unsigned, 2> Src1Regs, Src2Regs, DstRegs;
11471147
extractParts(MI.getOperand(1).getReg(), NarrowTy, NumParts, Src1Regs);
11481148
extractParts(MI.getOperand(2).getReg(), NarrowTy, NumParts, Src2Regs);
@@ -1157,6 +1157,48 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
11571157
MI.eraseFromParent();
11581158
return Legalized;
11591159
}
1160+
case TargetOpcode::G_LOAD:
1161+
case TargetOpcode::G_STORE: {
1162+
bool IsLoad = MI.getOpcode() == TargetOpcode::G_LOAD;
1163+
unsigned ValReg = MI.getOperand(0).getReg();
1164+
unsigned AddrReg = MI.getOperand(1).getReg();
1165+
unsigned NarrowSize = NarrowTy.getSizeInBits();
1166+
unsigned Size = MRI.getType(ValReg).getSizeInBits();
1167+
unsigned NumParts = Size / NarrowSize;
1168+
1169+
SmallVector<unsigned, 8> NarrowRegs;
1170+
if (!IsLoad)
1171+
extractParts(ValReg, NarrowTy, NumParts, NarrowRegs);
1172+
1173+
const LLT OffsetTy =
1174+
LLT::scalar(MRI.getType(AddrReg).getScalarSizeInBits());
1175+
MachineFunction &MF = *MI.getMF();
1176+
MachineMemOperand *MMO = *MI.memoperands_begin();
1177+
for (unsigned Idx = 0; Idx < NumParts; ++Idx) {
1178+
unsigned Adjustment = Idx * NarrowTy.getSizeInBits() / 8;
1179+
unsigned Alignment = MinAlign(MMO->getAlignment(), Adjustment);
1180+
unsigned NewAddrReg = 0;
1181+
MIRBuilder.materializeGEP(NewAddrReg, AddrReg, OffsetTy, Adjustment);
1182+
MachineMemOperand &NewMMO = *MF.getMachineMemOperand(
1183+
MMO->getPointerInfo().getWithOffset(Adjustment), MMO->getFlags(),
1184+
NarrowTy.getSizeInBits() / 8, Alignment);
1185+
if (IsLoad) {
1186+
unsigned Dst = MRI.createGenericVirtualRegister(NarrowTy);
1187+
NarrowRegs.push_back(Dst);
1188+
MIRBuilder.buildLoad(Dst, NewAddrReg, NewMMO);
1189+
} else {
1190+
MIRBuilder.buildStore(NarrowRegs[Idx], NewAddrReg, NewMMO);
1191+
}
1192+
}
1193+
if (IsLoad) {
1194+
if (NarrowTy.isVector())
1195+
MIRBuilder.buildConcatVectors(ValReg, NarrowRegs);
1196+
else
1197+
MIRBuilder.buildBuildVector(ValReg, NarrowRegs);
1198+
}
1199+
MI.eraseFromParent();
1200+
return Legalized;
1201+
}
11601202
}
11611203
}
11621204

test/CodeGen/AArch64/GlobalISel/legalize-load-fewerElts.mir

Lines changed: 0 additions & 39 deletions
This file was deleted.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -march=aarch64 -o - -run-pass=legalizer %s | FileCheck %s
3+
---
4+
name: load_v4s32
5+
legalized: false
6+
tracksRegLiveness: true
7+
body: |
8+
bb.1:
9+
liveins: $x0, $x1
10+
11+
; CHECK-LABEL: name: load_v4s32
12+
; CHECK: liveins: $x0, $x1
13+
; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
14+
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
15+
; CHECK: [[LOAD:%[0-9]+]]:_(<2 x s32>) = G_LOAD [[COPY]](p0) :: (load 8, align 16)
16+
; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
17+
; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C]](s64)
18+
; CHECK: [[LOAD1:%[0-9]+]]:_(<2 x s32>) = G_LOAD [[GEP]](p0) :: (load 8)
19+
; CHECK: G_STORE [[LOAD]](<2 x s32>), [[COPY1]](p0) :: (store 8, align 16)
20+
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
21+
; CHECK: [[GEP1:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C1]](s64)
22+
; CHECK: G_STORE [[LOAD1]](<2 x s32>), [[GEP1]](p0) :: (store 8)
23+
%0:_(p0) = COPY $x0
24+
%1:_(p0) = COPY $x1
25+
%2:_(<4 x s32>) = G_LOAD %0(p0) :: (load 16)
26+
G_STORE %2(<4 x s32>), %1(p0) :: (store 16)
27+
28+
...
29+
---
30+
name: load_v2s64
31+
legalized: false
32+
tracksRegLiveness: true
33+
body: |
34+
bb.1:
35+
liveins: $x0, $x1
36+
37+
; CHECK-LABEL: name: load_v2s64
38+
; CHECK: liveins: $x0, $x1
39+
; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
40+
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
41+
; CHECK: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[COPY]](p0) :: (load 8, align 16)
42+
; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
43+
; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C]](s64)
44+
; CHECK: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[GEP]](p0) :: (load 8)
45+
; CHECK: G_STORE [[LOAD]](s64), [[COPY1]](p0) :: (store 8, align 16)
46+
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
47+
; CHECK: [[GEP1:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C1]](s64)
48+
; CHECK: G_STORE [[LOAD1]](s64), [[GEP1]](p0) :: (store 8)
49+
%0:_(p0) = COPY $x0
50+
%1:_(p0) = COPY $x1
51+
%2:_(<2 x s64>) = G_LOAD %0(p0) :: (load 16)
52+
G_STORE %2(<2 x s64>), %1(p0) :: (store 16)
53+
54+
...

0 commit comments

Comments
 (0)