Skip to content

Commit 4fe0d35

Browse files
committed
[RISCV][GISel] Refactor most of selectConstant into a general constant materialization function.
Move the G_CONSTANT specific parts up to the switch that calls it. The materialization function will be used by G_FCONSTANT too. The only functional change is we now create COPY from X0 for the 0 case instead of changing the G_CONSTANT in place.
1 parent 1bb48c4 commit 4fe0d35

File tree

1 file changed

+23
-21
lines changed

1 file changed

+23
-21
lines changed

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

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,7 @@ class RISCVInstructionSelector : public InstructionSelector {
6161

6262
// Custom selection methods
6363
bool selectCopy(MachineInstr &MI, MachineRegisterInfo &MRI) const;
64-
bool selectConstant(MachineInstr &MI, MachineIRBuilder &MIB,
65-
MachineRegisterInfo &MRI) const;
64+
bool materializeImm(Register Reg, int64_t Imm, MachineIRBuilder &MIB) const;
6665
bool selectGlobalValue(MachineInstr &MI, MachineIRBuilder &MIB,
6766
MachineRegisterInfo &MRI) const;
6867
bool selectSExtInreg(MachineInstr &MI, MachineIRBuilder &MIB) const;
@@ -348,8 +347,16 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
348347
case TargetOpcode::G_INTTOPTR:
349348
case TargetOpcode::G_TRUNC:
350349
return selectCopy(MI, MRI);
351-
case TargetOpcode::G_CONSTANT:
352-
return selectConstant(MI, MIB, MRI);
350+
case TargetOpcode::G_CONSTANT: {
351+
Register DstReg = MI.getOperand(0).getReg();
352+
int64_t Imm = MI.getOperand(1).getCImm()->getSExtValue();
353+
354+
if (!materializeImm(DstReg, Imm, MIB))
355+
return false;
356+
357+
MI.eraseFromParent();
358+
return true;
359+
}
353360
case TargetOpcode::G_GLOBAL_VALUE:
354361
return selectGlobalValue(MI, MIB, MRI);
355362
case TargetOpcode::G_BRCOND: {
@@ -485,17 +492,13 @@ bool RISCVInstructionSelector::selectCopy(MachineInstr &MI,
485492
return true;
486493
}
487494

488-
bool RISCVInstructionSelector::selectConstant(MachineInstr &MI,
489-
MachineIRBuilder &MIB,
490-
MachineRegisterInfo &MRI) const {
491-
assert(MI.getOpcode() == TargetOpcode::G_CONSTANT);
492-
Register FinalReg = MI.getOperand(0).getReg();
493-
int64_t Imm = MI.getOperand(1).getCImm()->getSExtValue();
495+
bool RISCVInstructionSelector::materializeImm(Register DstReg, int64_t Imm,
496+
MachineIRBuilder &MIB) const {
497+
MachineRegisterInfo &MRI = *MIB.getMRI();
494498

495499
if (Imm == 0) {
496-
MI.getOperand(1).ChangeToRegister(RISCV::X0, false);
497-
RBI.constrainGenericRegister(FinalReg, RISCV::GPRRegClass, MRI);
498-
MI.setDesc(TII.get(TargetOpcode::COPY));
500+
MIB.buildCopy(DstReg, Register(RISCV::X0));
501+
RBI.constrainGenericRegister(DstReg, RISCV::GPRRegClass, MRI);
499502
return true;
500503
}
501504

@@ -505,35 +508,35 @@ bool RISCVInstructionSelector::selectConstant(MachineInstr &MI,
505508
Register SrcReg = RISCV::X0;
506509

507510
for (unsigned i = 0; i < NumInsts; i++) {
508-
Register DstReg = i < NumInsts - 1
511+
Register TmpReg = i < NumInsts - 1
509512
? MRI.createVirtualRegister(&RISCV::GPRRegClass)
510-
: FinalReg;
513+
: DstReg;
511514
const RISCVMatInt::Inst &I = Seq[i];
512515
MachineInstr *Result;
513516

514517
switch (I.getOpndKind()) {
515518
case RISCVMatInt::Imm:
516519
// clang-format off
517520
Result = MIB.buildInstr(I.getOpcode())
518-
.addDef(DstReg)
521+
.addDef(TmpReg)
519522
.addImm(I.getImm());
520523
// clang-format on
521524
break;
522525
case RISCVMatInt::RegX0:
523526
Result = MIB.buildInstr(I.getOpcode())
524-
.addDef(DstReg)
527+
.addDef(TmpReg)
525528
.addReg(SrcReg)
526529
.addReg(RISCV::X0);
527530
break;
528531
case RISCVMatInt::RegReg:
529532
Result = MIB.buildInstr(I.getOpcode())
530-
.addDef(DstReg)
533+
.addDef(TmpReg)
531534
.addReg(SrcReg)
532535
.addReg(SrcReg);
533536
break;
534537
case RISCVMatInt::RegImm:
535538
Result = MIB.buildInstr(I.getOpcode())
536-
.addDef(DstReg)
539+
.addDef(TmpReg)
537540
.addReg(SrcReg)
538541
.addImm(I.getImm());
539542
break;
@@ -542,10 +545,9 @@ bool RISCVInstructionSelector::selectConstant(MachineInstr &MI,
542545
if (!constrainSelectedInstRegOperands(*Result, TII, TRI, RBI))
543546
return false;
544547

545-
SrcReg = DstReg;
548+
SrcReg = TmpReg;
546549
}
547550

548-
MI.eraseFromParent();
549551
return true;
550552
}
551553

0 commit comments

Comments
 (0)