Skip to content

Commit b3ee3c9

Browse files
committed
Remove assert which is incorrect because removed kills aren't tracked through register aliases and doing so would be useless.
1 parent 341b7f5 commit b3ee3c9

File tree

1 file changed

+28
-32
lines changed

1 file changed

+28
-32
lines changed

llvm/lib/Target/Z80/Z80MachineLateOptimization.cpp

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,21 @@
2626
using namespace llvm;
2727

2828
namespace {
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

3535
public:
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

118112
class 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

136132
public:
@@ -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

Comments
 (0)