Skip to content

Commit 87e14f5

Browse files
authored
[CodeGen] Minor refactor of CSRSavedLocation struct [nfc] (#170721)
Add operator==, clarify invariants with an assert. This does convert one llvm_unreachable into an assert which runs earlier in the computation. I don't believe the difference is observable outside debug builds, and should report the fault closer to introduction.
1 parent c19e0b2 commit 87e14f5

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

llvm/lib/CodeGen/CFIInstrInserter.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,20 @@ class CFIInstrInserter : public MachineFunctionPass {
9090
/// contains the location where CSR register is saved.
9191
struct CSRSavedLocation {
9292
CSRSavedLocation(std::optional<unsigned> R, std::optional<int> O)
93-
: Reg(R), Offset(O) {}
93+
: Reg(R), Offset(O) {
94+
assert((Reg.has_value() ^ Offset.has_value()) &&
95+
"Register and offset can not both be valid");
96+
}
9497
std::optional<unsigned> Reg;
9598
std::optional<int> Offset;
99+
100+
bool operator==(const CSRSavedLocation &RHS) const {
101+
return Reg == RHS.Reg && Offset == RHS.Offset;
102+
}
103+
104+
bool operator!=(const CSRSavedLocation &RHS) const {
105+
return !(*this == RHS);
106+
}
96107
};
97108

98109
/// Contains cfa offset and register values valid at entry and exit of basic
@@ -267,11 +278,11 @@ void CFIInstrInserter::calculateOutgoingCFAInfo(MBBCFAInfo &MBBInfo) {
267278
break;
268279
}
269280
if (CSRReg || CSROffset) {
281+
CSRSavedLocation Loc(CSRReg, CSROffset);
270282
auto It = CSRLocMap.find(CFI.getRegister());
271283
if (It == CSRLocMap.end()) {
272-
CSRLocMap.insert(
273-
{CFI.getRegister(), CSRSavedLocation(CSRReg, CSROffset)});
274-
} else if (It->second.Reg != CSRReg || It->second.Offset != CSROffset) {
284+
CSRLocMap.insert({CFI.getRegister(), Loc});
285+
} else if (It->second != Loc) {
275286
reportFatalInternalError(
276287
"Different saved locations for the same CSR");
277288
}
@@ -397,11 +408,11 @@ bool CFIInstrInserter::insertCFIInstrs(MachineFunction &MF) {
397408
if (!RO.Reg && RO.Offset) {
398409
CFIIndex = MF.addFrameInst(
399410
MCCFIInstruction::createOffset(nullptr, Reg, *RO.Offset));
400-
} else if (RO.Reg && !RO.Offset) {
411+
} else {
412+
assert((RO.Reg && !RO.Offset) &&
413+
"Reg and Offset cannot both be valid/invalid");
401414
CFIIndex = MF.addFrameInst(
402415
MCCFIInstruction::createRegister(nullptr, Reg, *RO.Reg));
403-
} else {
404-
llvm_unreachable("RO.Reg and RO.Offset cannot both be valid/invalid");
405416
}
406417
BuildMI(*MBBInfo.MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
407418
.addCFIIndex(CFIIndex);

0 commit comments

Comments
 (0)