@@ -61,8 +61,7 @@ class RISCVInstructionSelector : public InstructionSelector {
61
61
62
62
// Custom selection methods
63
63
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 ;
66
65
bool selectGlobalValue (MachineInstr &MI, MachineIRBuilder &MIB,
67
66
MachineRegisterInfo &MRI) const ;
68
67
bool selectSExtInreg (MachineInstr &MI, MachineIRBuilder &MIB) const ;
@@ -348,8 +347,16 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
348
347
case TargetOpcode::G_INTTOPTR:
349
348
case TargetOpcode::G_TRUNC:
350
349
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
+ }
353
360
case TargetOpcode::G_GLOBAL_VALUE:
354
361
return selectGlobalValue (MI, MIB, MRI);
355
362
case TargetOpcode::G_BRCOND: {
@@ -485,17 +492,13 @@ bool RISCVInstructionSelector::selectCopy(MachineInstr &MI,
485
492
return true ;
486
493
}
487
494
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 ();
494
498
495
499
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);
499
502
return true ;
500
503
}
501
504
@@ -505,35 +508,35 @@ bool RISCVInstructionSelector::selectConstant(MachineInstr &MI,
505
508
Register SrcReg = RISCV::X0;
506
509
507
510
for (unsigned i = 0 ; i < NumInsts; i++) {
508
- Register DstReg = i < NumInsts - 1
511
+ Register TmpReg = i < NumInsts - 1
509
512
? MRI.createVirtualRegister (&RISCV::GPRRegClass)
510
- : FinalReg ;
513
+ : DstReg ;
511
514
const RISCVMatInt::Inst &I = Seq[i];
512
515
MachineInstr *Result;
513
516
514
517
switch (I.getOpndKind ()) {
515
518
case RISCVMatInt::Imm:
516
519
// clang-format off
517
520
Result = MIB.buildInstr (I.getOpcode ())
518
- .addDef (DstReg )
521
+ .addDef (TmpReg )
519
522
.addImm (I.getImm ());
520
523
// clang-format on
521
524
break ;
522
525
case RISCVMatInt::RegX0:
523
526
Result = MIB.buildInstr (I.getOpcode ())
524
- .addDef (DstReg )
527
+ .addDef (TmpReg )
525
528
.addReg (SrcReg)
526
529
.addReg (RISCV::X0);
527
530
break ;
528
531
case RISCVMatInt::RegReg:
529
532
Result = MIB.buildInstr (I.getOpcode ())
530
- .addDef (DstReg )
533
+ .addDef (TmpReg )
531
534
.addReg (SrcReg)
532
535
.addReg (SrcReg);
533
536
break ;
534
537
case RISCVMatInt::RegImm:
535
538
Result = MIB.buildInstr (I.getOpcode ())
536
- .addDef (DstReg )
539
+ .addDef (TmpReg )
537
540
.addReg (SrcReg)
538
541
.addImm (I.getImm ());
539
542
break ;
@@ -542,10 +545,9 @@ bool RISCVInstructionSelector::selectConstant(MachineInstr &MI,
542
545
if (!constrainSelectedInstRegOperands (*Result, TII, TRI, RBI))
543
546
return false ;
544
547
545
- SrcReg = DstReg ;
548
+ SrcReg = TmpReg ;
546
549
}
547
550
548
- MI.eraseFromParent ();
549
551
return true ;
550
552
}
551
553
0 commit comments