2626using namespace llvm ;
2727
2828namespace {
29- class ImmVal {
29+ class RegVal {
3030 static constexpr unsigned UnknownOff = ~0u ;
3131 const GlobalValue *GV = nullptr ;
3232 unsigned Off = UnknownOff, Mask = 0 ;
3333 MachineInstr *KilledBy = nullptr ;
3434
3535public:
36- ImmVal () {}
37- ImmVal (MCRegister Reg, const TargetRegisterInfo &TRI) {
36+ RegVal () {}
37+ RegVal (MCRegister Reg, const TargetRegisterInfo &TRI) {
3838 assert (Register::isPhysicalRegister (Reg) && " Expected physical register" );
3939 if (auto *RC = TRI.getMinimalPhysRegClass (Reg))
4040 Mask = maskTrailingOnes<decltype (Mask)>(TRI.getRegSizeInBits (*RC));
4141 }
42- ImmVal (MachineOperand &MO, MCRegister Reg, const TargetRegisterInfo &TRI)
43- : ImmVal (Reg, TRI) {
42+ RegVal (MachineOperand &MO, MCRegister Reg, const TargetRegisterInfo &TRI)
43+ : RegVal (Reg, TRI) {
4444 switch (MO.getType ()) {
4545 case MachineOperand::MO_Immediate:
4646 Off = MO.getImm ();
@@ -58,12 +58,12 @@ class ImmVal {
5858 Off &= Mask;
5959 assert (valid () && " Mask should have been less than 32 bits" );
6060 }
61- ImmVal (unsigned Imm, MCRegister Reg, const TargetRegisterInfo &TRI)
62- : ImmVal (Reg, TRI) {
61+ RegVal (unsigned Imm, MCRegister Reg, const TargetRegisterInfo &TRI)
62+ : RegVal (Reg, TRI) {
6363 Off = Imm & Mask;
6464 assert (valid () && " Mask should have been less than 32 bits" );
6565 }
66- ImmVal (const ImmVal &SuperVal, unsigned Idx, const TargetRegisterInfo &TRI) {
66+ RegVal (const RegVal &SuperVal, unsigned Idx, const TargetRegisterInfo &TRI) {
6767 Mask = maskTrailingOnes<decltype (Mask)>(TRI.getSubRegIdxSize (Idx));
6868 if (!SuperVal.isImm ())
6969 return ;
@@ -86,26 +86,20 @@ class ImmVal {
8686 return valid () && GV;
8787 }
8888
89- bool match (ImmVal &Val, int Delta = 0 ) const {
89+ bool match (RegVal &Val, int Delta = 0 ) const {
9090 return valid () && Val.valid () && GV == Val.GV && Mask == Val.Mask &&
9191 Off == ((Val.Off + Delta) & Mask);
9292 }
9393
9494 void setKilledBy (MachineInstr *MI) {
9595 KilledBy = MI;
9696 }
97-
98- void reuse (Register Reg, const TargetRegisterInfo &TRI) {
99- if (KilledBy) {
100- assert (KilledBy->killsRegister (Reg, &TRI) &&
101- " KilledBy should kill register" );
102- KilledBy->clearRegisterKills (Reg, &TRI);
103- KilledBy = nullptr ;
104- }
97+ MachineInstr *takeKilledBy () {
98+ return std::exchange (KilledBy, nullptr );
10599 }
106100
107101#ifndef NDEBUG
108- friend raw_ostream &operator <<(raw_ostream &OS, ImmVal &Val) {
102+ friend raw_ostream &operator <<(raw_ostream &OS, RegVal &Val) {
109103 if (!Val.valid ())
110104 return OS << " ?" ;
111105 if (Val.GV )
@@ -117,20 +111,22 @@ class ImmVal {
117111
118112class Z80MachineLateOptimization : public MachineFunctionPass {
119113 const TargetRegisterInfo *TRI;
120- ImmVal Vals[Z80::NUM_TARGET_REGS];
114+ RegVal Vals[Z80::NUM_TARGET_REGS];
121115
122116 void clobberAll () {
123117 for (unsigned Reg = 1 ; Reg != Z80::NUM_TARGET_REGS; ++Reg)
124- Vals[Reg] = ImmVal (Reg, *TRI);
118+ Vals[Reg] = RegVal (Reg, *TRI);
125119 }
126120 template <typename MCRegIterator>
127- void clobber (Register Reg, bool IncludeSelf) {
121+ void clobber (MCRegister Reg, bool IncludeSelf) {
128122 for (MCRegIterator I (Reg, TRI, IncludeSelf); I.isValid (); ++I)
129- Vals[*I] = ImmVal (*I, *TRI);
123+ Vals[*I] = RegVal (*I, *TRI);
124+ }
125+ void reuse (MCRegister Reg) {
126+ if (MachineInstr *KilledBy = Vals[Reg].takeKilledBy ())
127+ KilledBy->clearRegisterKills (Reg, TRI);
130128 }
131129
132- bool tryReplaceReg (MachineRegisterInfo &MRI, MCRegister FromReg,
133- MCRegister ToReg);
134130 void debug (const MachineInstr &MI);
135131
136132public:
@@ -166,22 +162,22 @@ bool Z80MachineLateOptimization::runOnMachineFunction(MachineFunction &MF) {
166162 case Z80::LD24r0:
167163 case Z80::LD24r_1: {
168164 Register Reg = MI.getOperand (0 ).getReg ();
169- ImmVal Val;
165+ RegVal Val;
170166 switch (Opc) {
171167 default :
172- Val = ImmVal (MI.getOperand (1 ), Reg, *TRI);
168+ Val = RegVal (MI.getOperand (1 ), Reg, *TRI);
173169 break ;
174170 case Z80::LD24r0:
175- Val = ImmVal (0 , Reg, *TRI);
171+ Val = RegVal (0 , Reg, *TRI);
176172 break ;
177173 case Z80::LD24r_1:
178- Val = ImmVal (-1 , Reg, *TRI);
174+ Val = RegVal (-1 , Reg, *TRI);
179175 break ;
180176 }
181177 if (Val.match (Vals[Reg])) {
182178 LLVM_DEBUG (dbgs () << " Erasing redundant: " ; MI.dump ());
183179 MI.eraseFromParent ();
184- Vals[Reg]. reuse (Reg, *TRI );
180+ reuse (Reg);
185181 Changed = true ;
186182 continue ;
187183 }
@@ -222,13 +218,13 @@ bool Z80MachineLateOptimization::runOnMachineFunction(MachineFunction &MF) {
222218 MI.setDesc (TII.get (Opc));
223219 MI.RemoveOperand (1 );
224220 MI.addImplicitDefUseOperands (MF);
225- Vals[Reg]. reuse (Reg, *TRI );
221+ reuse (Reg);
226222 LLVM_DEBUG (dbgs () << " With: " ; MI.dump (););
227223 }
228224 clobber<MCSuperRegIterator>(Reg, false );
229225 Vals[Reg] = Val;
230226 for (MCSubRegIndexIterator SRII (Reg, TRI); SRII.isValid (); ++SRII)
231- Vals[SRII.getSubReg ()] = ImmVal (Val, SRII.getSubRegIndex (), *TRI);
227+ Vals[SRII.getSubReg ()] = RegVal (Val, SRII.getSubRegIndex (), *TRI);
232228 debug (MI);
233229 continue ;
234230 }
@@ -262,7 +258,7 @@ bool Z80MachineLateOptimization::runOnMachineFunction(MachineFunction &MF) {
262258 else if (MO.isRegMask ())
263259 for (unsigned Reg = 1 ; Reg != Z80::NUM_TARGET_REGS; ++Reg)
264260 if (MO.clobbersPhysReg (Reg))
265- Vals[Reg] = ImmVal (Reg, *TRI);
261+ Vals[Reg] = RegVal (Reg, *TRI);
266262 }
267263 debug (MI);
268264 }
0 commit comments