Skip to content

Commit c6ef0ad

Browse files
committed
[𝘀𝗽𝗿] changes introduced through rebase
Created using spr 1.3.5 [skip ci]
1 parent 3f13932 commit c6ef0ad

File tree

4 files changed

+63
-48
lines changed

4 files changed

+63
-48
lines changed

llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
2424
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
25+
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
2526
#include "llvm/CodeGen/RuntimeLibcallUtil.h"
2627
#include "llvm/CodeGen/TargetOpcodes.h"
2728

@@ -297,9 +298,12 @@ class LegalizerHelper {
297298
MachineInstrBuilder createStackTemporary(TypeSize Bytes, Align Alignment,
298299
MachinePointerInfo &PtrInfo);
299300

300-
/// Create a store of \p Val to a stack temporary and return a load of the
301-
/// same value as type \p DestVT.
302-
MachineInstrBuilder createStackStoreLoad(Register Val, LLT DstTy);
301+
/// Create a store of \p Val to a stack temporary and return a load as the
302+
/// same type as \p Res.
303+
MachineInstrBuilder createStackStoreLoad(const DstOp &Res, const SrcOp &Val);
304+
305+
/// Given a store of a boolean vector, scalarize it.
306+
LegalizeResult scalarizeVectorBooleanStore(GStore &MI);
303307

304308
/// Get a pointer to vector element \p Index located in memory for a vector of
305309
/// type \p VecTy starting at a base address of \p VecPtr. If \p Index is out

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 54 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3023,6 +3023,7 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
30233023
return UnableToLegalize;
30243024

30253025
LLT Ty = MRI.getType(MI.getOperand(0).getReg());
3026+
assert(!Ty.isPointerOrPointerVector() && "Can't widen type");
30263027
if (!Ty.isScalar()) {
30273028
// We need to widen the vector element type.
30283029
Observer.changingInstr(MI);
@@ -4142,40 +4143,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerStore(GStore &StoreMI) {
41424143
}
41434144

41444145
if (MemTy.isVector()) {
4145-
LLT MemScalarTy = MemTy.getElementType();
4146-
if (MemTy != SrcTy) {
4147-
if (!MemScalarTy.isByteSized()) {
4148-
// We need to build an integer scalar of the vector bit pattern.
4149-
// It's not legal for us to add padding when storing a vector.
4150-
unsigned NumBits = MemTy.getSizeInBits();
4151-
LLT IntTy = LLT::scalar(NumBits);
4152-
auto CurrVal = MIRBuilder.buildConstant(IntTy, 0);
4153-
LLT IdxTy = getLLTForMVT(TLI.getVectorIdxTy(MF.getDataLayout()));
4154-
4155-
for (unsigned I = 0, E = MemTy.getNumElements(); I < E; ++I) {
4156-
auto Elt = MIRBuilder.buildExtractVectorElement(
4157-
SrcTy.getElementType(), SrcReg,
4158-
MIRBuilder.buildConstant(IdxTy, I));
4159-
auto Trunc = MIRBuilder.buildTrunc(MemScalarTy, Elt);
4160-
auto ZExt = MIRBuilder.buildZExt(IntTy, Trunc);
4161-
unsigned ShiftIntoIdx = MF.getDataLayout().isBigEndian()
4162-
? (MemTy.getNumElements() - 1) - I
4163-
: I;
4164-
auto ShiftAmt = MIRBuilder.buildConstant(
4165-
IntTy, ShiftIntoIdx * MemScalarTy.getSizeInBits());
4166-
auto Shifted = MIRBuilder.buildShl(IntTy, ZExt, ShiftAmt);
4167-
CurrVal = MIRBuilder.buildOr(IntTy, CurrVal, Shifted);
4168-
}
4169-
auto PtrInfo = MMO.getPointerInfo();
4170-
auto *NewMMO = MF.getMachineMemOperand(&MMO, PtrInfo, IntTy);
4171-
MIRBuilder.buildStore(CurrVal, PtrReg, *NewMMO);
4172-
StoreMI.eraseFromParent();
4173-
return Legalized;
4174-
}
4175-
4176-
// FIXME: implement simple scalarization.
4177-
return UnableToLegalize;
4178-
}
4146+
if (MemTy != SrcTy)
4147+
return scalarizeVectorBooleanStore(StoreMI);
41794148

41804149
// TODO: We can do better than scalarizing the vector and at least split it
41814150
// in half.
@@ -4230,6 +4199,50 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerStore(GStore &StoreMI) {
42304199
return Legalized;
42314200
}
42324201

4202+
LegalizerHelper::LegalizeResult
4203+
LegalizerHelper::scalarizeVectorBooleanStore(GStore &StoreMI) {
4204+
Register SrcReg = StoreMI.getValueReg();
4205+
Register PtrReg = StoreMI.getPointerReg();
4206+
LLT SrcTy = MRI.getType(SrcReg);
4207+
MachineMemOperand &MMO = **StoreMI.memoperands_begin();
4208+
LLT MemTy = MMO.getMemoryType();
4209+
LLT MemScalarTy = MemTy.getElementType();
4210+
MachineFunction &MF = MIRBuilder.getMF();
4211+
4212+
assert(SrcTy.isVector() && "Expect a vector store type");
4213+
4214+
if (!MemScalarTy.isByteSized()) {
4215+
// We need to build an integer scalar of the vector bit pattern.
4216+
// It's not legal for us to add padding when storing a vector.
4217+
unsigned NumBits = MemTy.getSizeInBits();
4218+
LLT IntTy = LLT::scalar(NumBits);
4219+
auto CurrVal = MIRBuilder.buildConstant(IntTy, 0);
4220+
LLT IdxTy = getLLTForMVT(TLI.getVectorIdxTy(MF.getDataLayout()));
4221+
4222+
for (unsigned I = 0, E = MemTy.getNumElements(); I < E; ++I) {
4223+
auto Elt = MIRBuilder.buildExtractVectorElement(
4224+
SrcTy.getElementType(), SrcReg, MIRBuilder.buildConstant(IdxTy, I));
4225+
auto Trunc = MIRBuilder.buildTrunc(MemScalarTy, Elt);
4226+
auto ZExt = MIRBuilder.buildZExt(IntTy, Trunc);
4227+
unsigned ShiftIntoIdx = MF.getDataLayout().isBigEndian()
4228+
? (MemTy.getNumElements() - 1) - I
4229+
: I;
4230+
auto ShiftAmt = MIRBuilder.buildConstant(
4231+
IntTy, ShiftIntoIdx * MemScalarTy.getSizeInBits());
4232+
auto Shifted = MIRBuilder.buildShl(IntTy, ZExt, ShiftAmt);
4233+
CurrVal = MIRBuilder.buildOr(IntTy, CurrVal, Shifted);
4234+
}
4235+
auto PtrInfo = MMO.getPointerInfo();
4236+
auto *NewMMO = MF.getMachineMemOperand(&MMO, PtrInfo, IntTy);
4237+
MIRBuilder.buildStore(CurrVal, PtrReg, *NewMMO);
4238+
StoreMI.eraseFromParent();
4239+
return Legalized;
4240+
}
4241+
4242+
// TODO: implement simple scalarization.
4243+
return UnableToLegalize;
4244+
}
4245+
42334246
LegalizerHelper::LegalizeResult
42344247
LegalizerHelper::bitcast(MachineInstr &MI, unsigned TypeIdx, LLT CastTy) {
42354248
switch (MI.getOpcode()) {
@@ -4695,18 +4708,18 @@ LegalizerHelper::createStackTemporary(TypeSize Bytes, Align Alignment,
46954708
return MIRBuilder.buildFrameIndex(FramePtrTy, FrameIdx);
46964709
}
46974710

4698-
MachineInstrBuilder LegalizerHelper::createStackStoreLoad(Register Val,
4699-
LLT DstTy) {
4700-
LLT SrcTy = MRI.getType(Val);
4701-
Align StackTypeAlign = getStackTemporaryAlignment(SrcTy);
4711+
MachineInstrBuilder LegalizerHelper::createStackStoreLoad(const DstOp &Res,
4712+
const SrcOp &Val) {
4713+
LLT SrcTy = Val.getLLTTy(MRI);
4714+
Align StackTypeAlign =
4715+
std::max(getStackTemporaryAlignment(SrcTy),
4716+
getStackTemporaryAlignment(Res.getLLTTy(MRI)));
47024717
MachinePointerInfo PtrInfo;
47034718
auto StackTemp =
47044719
createStackTemporary(SrcTy.getSizeInBytes(), StackTypeAlign, PtrInfo);
47054720

47064721
MIRBuilder.buildStore(Val, StackTemp, PtrInfo, StackTypeAlign);
4707-
return MIRBuilder.buildLoad(
4708-
DstTy, StackTemp, PtrInfo,
4709-
std::min(StackTypeAlign, getStackTemporaryAlignment(DstTy)));
4722+
return MIRBuilder.buildLoad(Res, StackTemp, PtrInfo, StackTypeAlign);
47104723
}
47114724

47124725
static Register clampVectorIndex(MachineIRBuilder &B, Register IdxReg,

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1430,8 +1430,7 @@ bool AArch64LegalizerInfo::legalizeBitcast(MachineInstr &MI,
14301430
SrcTy.getElementType() != LLT::scalar(1))
14311431
return false;
14321432

1433-
auto Load = Helper.createStackStoreLoad(SrcReg, DstTy);
1434-
Helper.MIRBuilder.buildCopy(DstReg, Load.getReg(0));
1433+
Helper.createStackStoreLoad(DstReg, SrcReg);
14351434
MI.eraseFromParent();
14361435
return true;
14371436
}

llvm/test/CodeGen/AArch64/GlobalISel/legalize-bitcast.mir

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,7 @@ body: |
108108
; CHECK-NEXT: [[OR7:%[0-9]+]]:_(s32) = G_OR [[OR6]], [[SHL7]]
109109
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[OR7]](s32)
110110
; CHECK-NEXT: G_STORE [[TRUNC]](s8), [[FRAME_INDEX]](p0) :: (store (s8) into %stack.0)
111-
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s8) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s8) from %stack.0)
112-
; CHECK-NEXT: %bc:_(s8) = COPY [[LOAD]](s8)
111+
; CHECK-NEXT: %bc:_(s8) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s8) from %stack.0)
113112
; CHECK-NEXT: %ext:_(s32) = G_ANYEXT %bc(s8)
114113
; CHECK-NEXT: $w0 = COPY %ext(s32)
115114
; CHECK-NEXT: RET_ReallyLR implicit $w0

0 commit comments

Comments
 (0)