Skip to content

Commit b679ec8

Browse files
committed
[RISCV] Use RISCVInstrInfo::movImm to implement most of RISCVPostRAExpandPseudo::expandMovImm (#70389)
1 parent 035c154 commit b679ec8

File tree

3 files changed

+25
-46
lines changed

3 files changed

+25
-46
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -776,7 +776,8 @@ MachineInstr *RISCVInstrInfo::foldMemoryOperandImpl(
776776
void RISCVInstrInfo::movImm(MachineBasicBlock &MBB,
777777
MachineBasicBlock::iterator MBBI,
778778
const DebugLoc &DL, Register DstReg, uint64_t Val,
779-
MachineInstr::MIFlag Flag) const {
779+
MachineInstr::MIFlag Flag, bool DstRenamable,
780+
bool DstIsDead) const {
780781
Register SrcReg = RISCV::X0;
781782

782783
if (!STI.is64Bit() && !isInt<32>(Val))
@@ -786,28 +787,39 @@ void RISCVInstrInfo::movImm(MachineBasicBlock &MBB,
786787
RISCVMatInt::generateInstSeq(Val, STI.getFeatureBits());
787788
assert(!Seq.empty());
788789

790+
bool SrcRenamable = false;
791+
unsigned Num = 0;
792+
789793
for (const RISCVMatInt::Inst &Inst : Seq) {
790-
unsigned SrcRegState = getKillRegState(SrcReg != RISCV::X0);
794+
bool LastItem = ++Num == Seq.size();
795+
unsigned DstRegState = getDeadRegState(DstIsDead && LastItem) |
796+
getRenamableRegState(DstRenamable);
797+
unsigned SrcRegState = getKillRegState(SrcReg != RISCV::X0) |
798+
getRenamableRegState(SrcRenamable);
791799
switch (Inst.getOpndKind()) {
792800
case RISCVMatInt::Imm:
793-
BuildMI(MBB, MBBI, DL, get(Inst.getOpcode()), DstReg)
801+
BuildMI(MBB, MBBI, DL, get(Inst.getOpcode()))
802+
.addReg(DstReg, RegState::Define | DstRegState)
794803
.addImm(Inst.getImm())
795804
.setMIFlag(Flag);
796805
break;
797806
case RISCVMatInt::RegX0:
798-
BuildMI(MBB, MBBI, DL, get(Inst.getOpcode()), DstReg)
807+
BuildMI(MBB, MBBI, DL, get(Inst.getOpcode()))
808+
.addReg(DstReg, RegState::Define | DstRegState)
799809
.addReg(SrcReg, SrcRegState)
800810
.addReg(RISCV::X0)
801811
.setMIFlag(Flag);
802812
break;
803813
case RISCVMatInt::RegReg:
804-
BuildMI(MBB, MBBI, DL, get(Inst.getOpcode()), DstReg)
814+
BuildMI(MBB, MBBI, DL, get(Inst.getOpcode()))
815+
.addReg(DstReg, RegState::Define | DstRegState)
805816
.addReg(SrcReg, SrcRegState)
806817
.addReg(SrcReg, SrcRegState)
807818
.setMIFlag(Flag);
808819
break;
809820
case RISCVMatInt::RegImm:
810-
BuildMI(MBB, MBBI, DL, get(Inst.getOpcode()), DstReg)
821+
BuildMI(MBB, MBBI, DL, get(Inst.getOpcode()))
822+
.addReg(DstReg, RegState::Define | DstRegState)
811823
.addReg(SrcReg, SrcRegState)
812824
.addImm(Inst.getImm())
813825
.setMIFlag(Flag);
@@ -816,6 +828,7 @@ void RISCVInstrInfo::movImm(MachineBasicBlock &MBB,
816828

817829
// Only the first instruction has X0 as its source.
818830
SrcReg = DstReg;
831+
SrcRenamable = DstRenamable;
819832
}
820833
}
821834

llvm/lib/Target/RISCV/RISCVInstrInfo.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ class RISCVInstrInfo : public RISCVGenInstrInfo {
9797
// Materializes the given integer Val into DstReg.
9898
void movImm(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
9999
const DebugLoc &DL, Register DstReg, uint64_t Val,
100-
MachineInstr::MIFlag Flag = MachineInstr::NoFlags) const;
100+
MachineInstr::MIFlag Flag = MachineInstr::NoFlags,
101+
bool DstRenamable = false, bool DstIsDead = false) const;
101102

102103
unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
103104

llvm/lib/Target/RISCV/RISCVPostRAExpandPseudoInsts.cpp

Lines changed: 4 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -92,48 +92,13 @@ bool RISCVPostRAExpandPseudo::expandMovImm(MachineBasicBlock &MBB,
9292
Val, MBB.getParent()->getSubtarget().getFeatureBits());
9393
assert(!Seq.empty());
9494

95-
Register SrcReg = RISCV::X0;
9695
Register DstReg = MBBI->getOperand(0).getReg();
9796
bool DstIsDead = MBBI->getOperand(0).isDead();
9897
bool Renamable = MBBI->getOperand(0).isRenamable();
99-
bool SrcRenamable = false;
100-
unsigned Num = 0;
101-
102-
for (RISCVMatInt::Inst &Inst : Seq) {
103-
bool LastItem = ++Num == Seq.size();
104-
unsigned DstRegState = getDeadRegState(DstIsDead && LastItem) |
105-
getRenamableRegState(Renamable);
106-
unsigned SrcRegState = getKillRegState(SrcReg != RISCV::X0) |
107-
getRenamableRegState(SrcRenamable);
108-
switch (Inst.getOpndKind()) {
109-
case RISCVMatInt::Imm:
110-
BuildMI(MBB, MBBI, DL, TII->get(Inst.getOpcode()))
111-
.addReg(DstReg, RegState::Define | DstRegState)
112-
.addImm(Inst.getImm());
113-
break;
114-
case RISCVMatInt::RegX0:
115-
BuildMI(MBB, MBBI, DL, TII->get(Inst.getOpcode()))
116-
.addReg(DstReg, RegState::Define | DstRegState)
117-
.addReg(SrcReg, SrcRegState)
118-
.addReg(RISCV::X0);
119-
break;
120-
case RISCVMatInt::RegReg:
121-
BuildMI(MBB, MBBI, DL, TII->get(Inst.getOpcode()))
122-
.addReg(DstReg, RegState::Define | DstRegState)
123-
.addReg(SrcReg, SrcRegState)
124-
.addReg(SrcReg, SrcRegState);
125-
break;
126-
case RISCVMatInt::RegImm:
127-
BuildMI(MBB, MBBI, DL, TII->get(Inst.getOpcode()))
128-
.addReg(DstReg, RegState::Define | DstRegState)
129-
.addReg(SrcReg, SrcRegState)
130-
.addImm(Inst.getImm());
131-
break;
132-
}
133-
// Only the first instruction has X0 as its source.
134-
SrcReg = DstReg;
135-
SrcRenamable = Renamable;
136-
}
98+
99+
TII->movImm(MBB, MBBI, DL, DstReg, Val, MachineInstr::NoFlags, Renamable,
100+
DstIsDead);
101+
137102
MBBI->eraseFromParent();
138103
return true;
139104
}

0 commit comments

Comments
 (0)