Skip to content

Commit 7603e85

Browse files
authored
[LLVM][TableGen] Change PseudoLoweringEmitter to use const RecordKeeper (llvm#109194)
Change PseudoLoweringEmitter to use const RecordKeeper. This is a part of effort to have better const correctness in TableGen backends: https://discourse.llvm.org/t/psa-planned-changes-to-tablegen-getallderiveddefinitions-api-potential-downstream-breakages/81089
1 parent 4194e8d commit 7603e85

File tree

1 file changed

+26
-30
lines changed

1 file changed

+26
-30
lines changed

llvm/utils/TableGen/PseudoLoweringEmitter.cpp

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class PseudoLoweringEmitter {
2929
union {
3030
unsigned Operand; // Operand number mapped to.
3131
uint64_t Imm; // Integer immedate value.
32-
Record *Reg; // Physical register.
32+
const Record *Reg; // Physical register.
3333
} Data;
3434
};
3535
struct PseudoExpansion {
@@ -42,24 +42,24 @@ class PseudoLoweringEmitter {
4242
: Source(s), Dest(d), OperandMap(m) {}
4343
};
4444

45-
RecordKeeper &Records;
45+
const RecordKeeper &Records;
4646

4747
// It's overkill to have an instance of the full CodeGenTarget object,
4848
// but it loads everything on demand, not in the constructor, so it's
4949
// lightweight in performance, so it works out OK.
50-
CodeGenTarget Target;
50+
const CodeGenTarget Target;
5151

5252
SmallVector<PseudoExpansion, 64> Expansions;
5353

54-
unsigned addDagOperandMapping(Record *Rec, DagInit *Dag,
55-
CodeGenInstruction &Insn,
54+
unsigned addDagOperandMapping(const Record *Rec, const DagInit *Dag,
55+
const CodeGenInstruction &Insn,
5656
IndexedMap<OpData> &OperandMap,
5757
unsigned BaseIdx);
58-
void evaluateExpansion(Record *Pseudo);
58+
void evaluateExpansion(const Record *Pseudo);
5959
void emitLoweringEmitter(raw_ostream &o);
6060

6161
public:
62-
PseudoLoweringEmitter(RecordKeeper &R) : Records(R), Target(R) {}
62+
PseudoLoweringEmitter(const RecordKeeper &R) : Records(R), Target(R) {}
6363

6464
/// run - Output the pseudo-lowerings.
6565
void run(raw_ostream &o);
@@ -69,13 +69,12 @@ class PseudoLoweringEmitter {
6969
// FIXME: This pass currently can only expand a pseudo to a single instruction.
7070
// The pseudo expansion really should take a list of dags, not just
7171
// a single dag, so we can do fancier things.
72-
7372
unsigned PseudoLoweringEmitter::addDagOperandMapping(
74-
Record *Rec, DagInit *Dag, CodeGenInstruction &Insn,
73+
const Record *Rec, const DagInit *Dag, const CodeGenInstruction &Insn,
7574
IndexedMap<OpData> &OperandMap, unsigned BaseIdx) {
7675
unsigned OpsAdded = 0;
7776
for (unsigned i = 0, e = Dag->getNumArgs(); i != e; ++i) {
78-
if (DefInit *DI = dyn_cast<DefInit>(Dag->getArg(i))) {
77+
if (const DefInit *DI = dyn_cast<DefInit>(Dag->getArg(i))) {
7978
// Physical register reference. Explicit check for the special case
8079
// "zero_reg" definition.
8180
if (DI->getDef()->isSubClassOf("Register") ||
@@ -105,17 +104,15 @@ unsigned PseudoLoweringEmitter::addDagOperandMapping(
105104
for (unsigned I = 0, E = Insn.Operands[i].MINumOperands; I != E; ++I)
106105
OperandMap[BaseIdx + i + I].Kind = OpData::Operand;
107106
OpsAdded += Insn.Operands[i].MINumOperands;
108-
} else if (IntInit *II = dyn_cast<IntInit>(Dag->getArg(i))) {
107+
} else if (const IntInit *II = dyn_cast<IntInit>(Dag->getArg(i))) {
109108
OperandMap[BaseIdx + i].Kind = OpData::Imm;
110109
OperandMap[BaseIdx + i].Data.Imm = II->getValue();
111110
++OpsAdded;
112-
} else if (auto *BI = dyn_cast<BitsInit>(Dag->getArg(i))) {
113-
auto *II =
114-
cast<IntInit>(BI->convertInitializerTo(IntRecTy::get(Records)));
111+
} else if (const auto *BI = dyn_cast<BitsInit>(Dag->getArg(i))) {
115112
OperandMap[BaseIdx + i].Kind = OpData::Imm;
116-
OperandMap[BaseIdx + i].Data.Imm = II->getValue();
113+
OperandMap[BaseIdx + i].Data.Imm = *BI->convertInitializerToInt();
117114
++OpsAdded;
118-
} else if (DagInit *SubDag = dyn_cast<DagInit>(Dag->getArg(i))) {
115+
} else if (const DagInit *SubDag = dyn_cast<DagInit>(Dag->getArg(i))) {
119116
// Just add the operands recursively. This is almost certainly
120117
// a constant value for a complex operand (> 1 MI operand).
121118
unsigned NewOps =
@@ -129,23 +126,23 @@ unsigned PseudoLoweringEmitter::addDagOperandMapping(
129126
return OpsAdded;
130127
}
131128

132-
void PseudoLoweringEmitter::evaluateExpansion(Record *Rec) {
129+
void PseudoLoweringEmitter::evaluateExpansion(const Record *Rec) {
133130
LLVM_DEBUG(dbgs() << "Pseudo definition: " << Rec->getName() << "\n");
134131

135132
// Validate that the result pattern has the corrent number and types
136133
// of arguments for the instruction it references.
137-
DagInit *Dag = Rec->getValueAsDag("ResultInst");
134+
const DagInit *Dag = Rec->getValueAsDag("ResultInst");
138135
assert(Dag && "Missing result instruction in pseudo expansion!");
139136
LLVM_DEBUG(dbgs() << " Result: " << *Dag << "\n");
140137

141-
DefInit *OpDef = dyn_cast<DefInit>(Dag->getOperator());
138+
const DefInit *OpDef = dyn_cast<DefInit>(Dag->getOperator());
142139
if (!OpDef) {
143140
PrintError(Rec, "In pseudo instruction '" + Rec->getName() +
144141
"', result operator is not a record");
145142
PrintFatalNote(Rec->getValue("ResultInst"),
146143
"Result was assigned at the following location:");
147144
}
148-
Record *Operator = OpDef->getDef();
145+
const Record *Operator = OpDef->getDef();
149146
if (!Operator->isSubClassOf("Instruction")) {
150147
PrintError(Rec, "In pseudo instruction '" + Rec->getName() +
151148
"', result operator '" + Operator->getName() +
@@ -173,8 +170,8 @@ void PseudoLoweringEmitter::evaluateExpansion(Record *Rec) {
173170
}
174171

175172
unsigned NumMIOperands = 0;
176-
for (unsigned i = 0, e = Insn.Operands.size(); i != e; ++i)
177-
NumMIOperands += Insn.Operands[i].MINumOperands;
173+
for (const auto &Op : Insn.Operands)
174+
NumMIOperands += Op.MINumOperands;
178175
IndexedMap<OpData> OperandMap;
179176
OperandMap.grow(NumMIOperands);
180177

@@ -192,8 +189,8 @@ void PseudoLoweringEmitter::evaluateExpansion(Record *Rec) {
192189
// the lowering emitter.
193190
CodeGenInstruction SourceInsn(Rec);
194191
StringMap<unsigned> SourceOperands;
195-
for (unsigned i = 0, e = SourceInsn.Operands.size(); i != e; ++i)
196-
SourceOperands[SourceInsn.Operands[i].Name] = i;
192+
for (const auto &[Idx, SrcOp] : enumerate(SourceInsn.Operands))
193+
SourceOperands[SrcOp.Name] = Idx;
197194

198195
LLVM_DEBUG(dbgs() << " Operand mapping:\n");
199196
for (unsigned i = 0, e = Insn.Operands.size(); i != e; ++i) {
@@ -265,7 +262,7 @@ void PseudoLoweringEmitter::emitLoweringEmitter(raw_ostream &o) {
265262
<< Expansion.OperandMap[MIOpNo + i].Data.Imm << "));\n";
266263
break;
267264
case OpData::Reg: {
268-
Record *Reg = Expansion.OperandMap[MIOpNo + i].Data.Reg;
265+
const Record *Reg = Expansion.OperandMap[MIOpNo + i].Data.Reg;
269266
o << " Inst.addOperand(MCOperand::createReg(";
270267
// "zero_reg" is special.
271268
if (Reg->getName() == "zero_reg")
@@ -297,19 +294,18 @@ void PseudoLoweringEmitter::emitLoweringEmitter(raw_ostream &o) {
297294
o << "\n}\n\n";
298295
}
299296

300-
void PseudoLoweringEmitter::run(raw_ostream &o) {
297+
void PseudoLoweringEmitter::run(raw_ostream &OS) {
301298
StringRef Classes[] = {"PseudoInstExpansion", "Instruction"};
302-
std::vector<Record *> Insts = Records.getAllDerivedDefinitions(Classes);
303299

304300
// Process the pseudo expansion definitions, validating them as we do so.
305301
Records.startTimer("Process definitions");
306-
for (unsigned i = 0, e = Insts.size(); i != e; ++i)
307-
evaluateExpansion(Insts[i]);
302+
for (const Record *Inst : Records.getAllDerivedDefinitions(Classes))
303+
evaluateExpansion(Inst);
308304

309305
// Generate expansion code to lower the pseudo to an MCInst of the real
310306
// instruction.
311307
Records.startTimer("Emit expansion code");
312-
emitLoweringEmitter(o);
308+
emitLoweringEmitter(OS);
313309
}
314310

315311
static TableGen::Emitter::OptClass<PseudoLoweringEmitter>

0 commit comments

Comments
 (0)