Skip to content

Commit e1f926d

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 b40b02e commit e1f926d

File tree

4 files changed

+28
-64
lines changed

4 files changed

+28
-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: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2987,53 +2987,48 @@ 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(
2991+
Register DstReg, const Constant *ConstVal,
2992+
MachineIRBuilder &MIRBuilder) {
2993+
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
29942994
MachineFunction &MF = MIRBuilder.getMF();
29952995
const DataLayout &DL = MIRBuilder.getDataLayout();
2996-
29972996
unsigned AddrSpace = DL.getDefaultGlobalsAddressSpace();
29982997
LLT AddrPtrTy = LLT::pointer(AddrSpace, DL.getPointerSizeInBits(AddrSpace));
2999-
Align Alignment = Align(DL.getABITypeAlign(
3000-
getFloatTypeForLLT(MF.getFunction().getContext(), MRI.getType(Dst))));
2998+
LLT DstLLT = MRI.getType(DstReg);
2999+
3000+
Align Alignment(DL.getABITypeAlign(ConstVal->getType()));
30013001

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

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

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

30133022
return Legalized;
30143023
}
30153024

30163025
LegalizerHelper::LegalizeResult
30173026
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);
3027+
MachineOperand ConstOperand = MI.getOperand(1);
3028+
assert (ConstOperand.isFPImm());
3029+
const Constant *ConstantVal = ConstOperand.getFPImm();
30353030

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

30393034
return Legalized;

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

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

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