Skip to content

Commit be20e36

Browse files
Petar AvramovicPetar Avramovic
authored andcommitted
[MIPS GlobalISel] Register bank select for G_PHI. Select i64 phi
Select gprb or fprb when def/use register operand of G_PHI is used/defined by either: copy to/from physical register or instruction with only one mapping available for that use/def operand. Integer s64 phi is handled with narrowScalar when mapping is applied, produced artifacts are combined away. Manually set gprb to all register operands of instructions created during narrowScalar. Differential Revision: https://reviews.llvm.org/D64351 llvm-svn: 365494
1 parent fdd761a commit be20e36

File tree

6 files changed

+564
-27
lines changed

6 files changed

+564
-27
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,34 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
708708
narrowScalarDst(MI, NarrowTy, 0, TargetOpcode::G_ZEXT);
709709
Observer.changedInstr(MI);
710710
return Legalized;
711+
case TargetOpcode::G_PHI: {
712+
unsigned NumParts = SizeOp0 / NarrowSize;
713+
SmallVector<Register, 2> DstRegs;
714+
SmallVector<SmallVector<Register, 2>, 2> SrcRegs;
715+
DstRegs.resize(NumParts);
716+
SrcRegs.resize(MI.getNumOperands() / 2);
717+
Observer.changingInstr(MI);
718+
for (unsigned i = 1; i < MI.getNumOperands(); i += 2) {
719+
MachineBasicBlock &OpMBB = *MI.getOperand(i + 1).getMBB();
720+
MIRBuilder.setInsertPt(OpMBB, OpMBB.getFirstTerminator());
721+
extractParts(MI.getOperand(i).getReg(), NarrowTy, NumParts,
722+
SrcRegs[i / 2]);
723+
}
724+
MachineBasicBlock &MBB = *MI.getParent();
725+
MIRBuilder.setInsertPt(MBB, MI);
726+
for (unsigned i = 0; i < NumParts; ++i) {
727+
DstRegs[i] = MRI.createGenericVirtualRegister(NarrowTy);
728+
MachineInstrBuilder MIB =
729+
MIRBuilder.buildInstr(TargetOpcode::G_PHI).addDef(DstRegs[i]);
730+
for (unsigned j = 1; j < MI.getNumOperands(); j += 2)
731+
MIB.addUse(SrcRegs[j / 2][i]).add(MI.getOperand(j + 1));
732+
}
733+
MIRBuilder.setInsertPt(MBB, --MBB.getFirstNonPHI());
734+
MIRBuilder.buildMerge(MI.getOperand(0).getReg(), DstRegs);
735+
Observer.changedInstr(MI);
736+
MI.eraseFromParent();
737+
return Legalized;
738+
}
711739
}
712740
}
713741

llvm/lib/Target/Mips/MipsLegalizerInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ MipsLegalizerInfo::MipsLegalizerInfo(const MipsSubtarget &ST) {
6464
.minScalar(0, s32);
6565

6666
getActionDefinitionsBuilder(G_PHI)
67-
.legalFor({p0, s32})
67+
.legalFor({p0, s32, s64})
6868
.minScalar(0, s32);
6969

7070
getActionDefinitionsBuilder({G_AND, G_OR, G_XOR})

llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,13 @@ MipsRegisterBankInfo::AmbiguousRegDefUseContainer::AmbiguousRegDefUseContainer(
195195
if (MI->getOpcode() == TargetOpcode::G_STORE)
196196
addUseDef(MI->getOperand(0).getReg(), MRI);
197197

198+
if (MI->getOpcode() == TargetOpcode::G_PHI) {
199+
addDefUses(MI->getOperand(0).getReg(), MRI);
200+
201+
for (unsigned i = 1; i < MI->getNumOperands(); i += 2)
202+
addUseDef(MI->getOperand(i).getReg(), MRI);
203+
}
204+
198205
if (MI->getOpcode() == TargetOpcode::G_SELECT) {
199206
addDefUses(MI->getOperand(0).getReg(), MRI);
200207

@@ -305,9 +312,12 @@ MipsRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
305312
const MachineFunction &MF = *MI.getParent()->getParent();
306313
const MachineRegisterInfo &MRI = MF.getRegInfo();
307314

308-
const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI);
309-
if (Mapping.isValid())
310-
return Mapping;
315+
if (MI.getOpcode() != TargetOpcode::G_PHI) {
316+
const RegisterBankInfo::InstructionMapping &Mapping =
317+
getInstrMappingImpl(MI);
318+
if (Mapping.isValid())
319+
return Mapping;
320+
}
311321

312322
using namespace TargetOpcode;
313323

@@ -384,6 +394,26 @@ MipsRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
384394
}
385395
break;
386396
}
397+
case G_PHI: {
398+
unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
399+
InstType InstTy = InstType::Integer;
400+
if (!MRI.getType(MI.getOperand(0).getReg()).isPointer()) {
401+
InstTy = TI.determineInstType(&MI);
402+
}
403+
404+
// PHI is copylike and should have one regbank in mapping for def register.
405+
if (InstTy == InstType::Integer && Size == 64) { // fprb
406+
OperandsMapping =
407+
getOperandsMapping({&Mips::ValueMappings[Mips::DPRIdx]});
408+
return getInstructionMapping(CustomMappingID, /*Cost=*/1, OperandsMapping,
409+
/*NumOperands=*/1);
410+
}
411+
// Use default handling for PHI, i.e. set reg bank of def operand to match
412+
// register banks of use operands.
413+
const RegisterBankInfo::InstructionMapping &Mapping =
414+
getInstrMappingImpl(MI);
415+
return Mapping;
416+
}
387417
case G_SELECT: {
388418
unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
389419
InstType InstTy = InstType::Integer;
@@ -545,6 +575,7 @@ void MipsRegisterBankInfo::applyMappingImpl(
545575
switch (MI.getOpcode()) {
546576
case TargetOpcode::G_LOAD:
547577
case TargetOpcode::G_STORE:
578+
case TargetOpcode::G_PHI:
548579
case TargetOpcode::G_SELECT: {
549580
Helper.narrowScalar(MI, 0, LLT::scalar(32));
550581
// Handle new instructions.

0 commit comments

Comments
 (0)