Skip to content

Commit c89c3ab

Browse files
committed
[GlobalISel] Lower integer constants to constant pool in
LegalizerHelper. Extend LegalizerHelper's API to lower integer constants to a load from constant pool. Previously, this lowering existed only for FP constants. Apply this change to RISCV.
1 parent 6aa28a8 commit c89c3ab

File tree

4 files changed

+27
-64
lines changed

4 files changed

+27
-64
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ class LegalizerHelper {
365365
LegalizeResult bitcastInsertVectorElt(MachineInstr &MI, unsigned TypeIdx,
366366
LLT CastTy);
367367

368+
LegalizeResult lowerConstant(MachineInstr &MI);
368369
LegalizeResult lowerFConstant(MachineInstr &MI);
369370
LegalizeResult lowerBitcast(MachineInstr &MI);
370371
LegalizeResult lowerLoad(GAnyLoad &MI);

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2987,53 +2987,47 @@ static void getUnmergePieces(SmallVectorImpl<Register> &Pieces,
29872987
Pieces.push_back(Unmerge.getReg(I));
29882988
}
29892989

2990-
LegalizerHelper::LegalizeResult
2991-
LegalizerHelper::lowerConstant(MachineInstr &MI) {
2992-
Register Dst = MI.getOperand(0).getReg();
2993-
2990+
static void emitLoadFromConstantPool(Register DstReg, const Constant *ConstVal,
2991+
MachineIRBuilder &MIRBuilder) {
2992+
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
29942993
MachineFunction &MF = MIRBuilder.getMF();
29952994
const DataLayout &DL = MIRBuilder.getDataLayout();
2996-
29972995
unsigned AddrSpace = DL.getDefaultGlobalsAddressSpace();
29982996
LLT AddrPtrTy = LLT::pointer(AddrSpace, DL.getPointerSizeInBits(AddrSpace));
2999-
Align Alignment = Align(DL.getABITypeAlign(
3000-
getFloatTypeForLLT(MF.getFunction().getContext(), MRI.getType(Dst))));
2997+
LLT DstLLT = MRI.getType(DstReg);
2998+
2999+
Align Alignment(DL.getABITypeAlign(ConstVal->getType()));
30013000

30023001
auto Addr = MIRBuilder.buildConstantPool(
3003-
AddrPtrTy, MF.getConstantPool()->getConstantPoolIndex(
3004-
MI.getOperand(1).getFPImm(), Alignment));
3002+
AddrPtrTy,
3003+
MF.getConstantPool()->getConstantPoolIndex(ConstVal, Alignment));
30053004

3006-
MachineMemOperand *MMO = MF.getMachineMemOperand(
3007-
MachinePointerInfo::getConstantPool(MF), MachineMemOperand::MOLoad,
3008-
MRI.getType(Dst), Alignment);
3005+
MachineMemOperand *MMO =
3006+
MF.getMachineMemOperand(MachinePointerInfo::getConstantPool(MF),
3007+
MachineMemOperand::MOLoad, DstLLT, Alignment);
3008+
3009+
MIRBuilder.buildLoadInstr(TargetOpcode::G_LOAD, DstReg, Addr, *MMO);
3010+
}
3011+
3012+
LegalizerHelper::LegalizeResult
3013+
LegalizerHelper::lowerConstant(MachineInstr &MI) {
3014+
MachineOperand ConstOperand = MI.getOperand(1);
3015+
assert(ConstOperand.isCImm());
3016+
const Constant *ConstantVal = ConstOperand.getCImm();
30093017

3010-
MIRBuilder.buildLoadInstr(TargetOpcode::G_LOAD, Dst, Addr, *MMO);
3018+
emitLoadFromConstantPool(MI.getOperand(0).getReg(), ConstantVal, MIRBuilder);
30113019
MI.eraseFromParent();
30123020

30133021
return Legalized;
30143022
}
30153023

30163024
LegalizerHelper::LegalizeResult
30173025
LegalizerHelper::lowerFConstant(MachineInstr &MI) {
3018-
Register Dst = MI.getOperand(0).getReg();
3019-
3020-
MachineFunction &MF = MIRBuilder.getMF();
3021-
const DataLayout &DL = MIRBuilder.getDataLayout();
3022-
3023-
unsigned AddrSpace = DL.getDefaultGlobalsAddressSpace();
3024-
LLT AddrPtrTy = LLT::pointer(AddrSpace, DL.getPointerSizeInBits(AddrSpace));
3025-
Align Alignment = Align(DL.getABITypeAlign(
3026-
getFloatTypeForLLT(MF.getFunction().getContext(), MRI.getType(Dst))));
3027-
3028-
auto Addr = MIRBuilder.buildConstantPool(
3029-
AddrPtrTy, MF.getConstantPool()->getConstantPoolIndex(
3030-
MI.getOperand(1).getFPImm(), Alignment));
3031-
3032-
MachineMemOperand *MMO = MF.getMachineMemOperand(
3033-
MachinePointerInfo::getConstantPool(MF), MachineMemOperand::MOLoad,
3034-
MRI.getType(Dst), Alignment);
3026+
MachineOperand ConstOperand = MI.getOperand(1);
3027+
assert(ConstOperand.isFPImm());
3028+
const Constant *ConstantVal = ConstOperand.getFPImm();
30353029

3036-
MIRBuilder.buildLoadInstr(TargetOpcode::G_LOAD, Dst, Addr, *MMO);
3030+
emitLoadFromConstantPool(MI.getOperand(0).getReg(), ConstantVal, MIRBuilder);
30373031
MI.eraseFromParent();
30383032

30393033
return Legalized;

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

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -495,33 +495,6 @@ bool RISCVLegalizerInfo::shouldBeInConstantPool(APInt APImm,
495495
return !(!SeqLo.empty() && (SeqLo.size() + 2) <= STI.getMaxBuildIntsCost());
496496
}
497497

498-
// TODO: This is almost the same as LegalizerHelper::lowerFConstant and is
499-
// target-independent. Should we move this to LegalizeHelper?
500-
bool RISCVLegalizerInfo::emitLoadFromConstantPool(
501-
Register DstReg, const Constant *ConstVal,
502-
MachineIRBuilder &MIRBuilder) const {
503-
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
504-
MachineFunction &MF = MIRBuilder.getMF();
505-
const DataLayout &DL = MIRBuilder.getDataLayout();
506-
LLVMContext &Ctx = MF.getFunction().getContext();
507-
unsigned AddrSpace = DL.getDefaultGlobalsAddressSpace();
508-
LLT AddrPtrTy = LLT::pointer(AddrSpace, DL.getPointerSizeInBits(AddrSpace));
509-
LLT DstLLT = MRI.getType(DstReg);
510-
511-
Align Alignment(DL.getABITypeAlign(getTypeForLLT(DstLLT, Ctx)));
512-
513-
auto Addr = MIRBuilder.buildConstantPool(
514-
AddrPtrTy,
515-
MF.getConstantPool()->getConstantPoolIndex(ConstVal, Alignment));
516-
517-
MachineMemOperand *MMO =
518-
MF.getMachineMemOperand(MachinePointerInfo::getConstantPool(MF),
519-
MachineMemOperand::MOLoad, DstLLT, Alignment);
520-
521-
MIRBuilder.buildLoadInstr(TargetOpcode::G_LOAD, DstReg, Addr, *MMO);
522-
return true;
523-
}
524-
525498
bool RISCVLegalizerInfo::legalizeCustom(
526499
LegalizerHelper &Helper, MachineInstr &MI,
527500
LostDebugLocObserver &LocObserver) const {
@@ -543,10 +516,7 @@ bool RISCVLegalizerInfo::legalizeCustom(
543516
const ConstantInt *ConstVal = MI.getOperand(1).getCImm();
544517
if (!shouldBeInConstantPool(ConstVal->getValue(), ShouldOptForSize))
545518
return true;
546-
emitLoadFromConstantPool(MI.getOperand(0).getReg(),
547-
MI.getOperand(1).getCImm(), MIRBuilder);
548-
MI.eraseFromParent();
549-
return true;
519+
return Helper.lowerConstant(MI);
550520
}
551521
case TargetOpcode::G_SHL:
552522
case TargetOpcode::G_ASHR:

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ class RISCVLegalizerInfo : public LegalizerInfo {
3838

3939
private:
4040
bool shouldBeInConstantPool(APInt APImm, bool ShouldOptForSize) const;
41-
bool emitLoadFromConstantPool(Register DstReg, const Constant *CPVal,
42-
MachineIRBuilder &MIRBuilder) const;
4341
bool legalizeShlAshrLshr(MachineInstr &MI, MachineIRBuilder &MIRBuilder,
4442
GISelChangeObserver &Observer) const;
4543

0 commit comments

Comments
 (0)