@@ -29,7 +29,7 @@ class PseudoLoweringEmitter {
29
29
union {
30
30
unsigned Operand; // Operand number mapped to.
31
31
uint64_t Imm; // Integer immedate value.
32
- Record *Reg; // Physical register.
32
+ const Record *Reg; // Physical register.
33
33
} Data;
34
34
};
35
35
struct PseudoExpansion {
@@ -42,24 +42,24 @@ class PseudoLoweringEmitter {
42
42
: Source(s), Dest(d), OperandMap(m) {}
43
43
};
44
44
45
- RecordKeeper &Records;
45
+ const RecordKeeper &Records;
46
46
47
47
// It's overkill to have an instance of the full CodeGenTarget object,
48
48
// but it loads everything on demand, not in the constructor, so it's
49
49
// lightweight in performance, so it works out OK.
50
- CodeGenTarget Target;
50
+ const CodeGenTarget Target;
51
51
52
52
SmallVector<PseudoExpansion, 64 > Expansions;
53
53
54
- unsigned addDagOperandMapping (Record *Rec, DagInit *Dag,
55
- CodeGenInstruction &Insn,
54
+ unsigned addDagOperandMapping (const Record *Rec, const DagInit *Dag,
55
+ const CodeGenInstruction &Insn,
56
56
IndexedMap<OpData> &OperandMap,
57
57
unsigned BaseIdx);
58
- void evaluateExpansion (Record *Pseudo);
58
+ void evaluateExpansion (const Record *Pseudo);
59
59
void emitLoweringEmitter (raw_ostream &o);
60
60
61
61
public:
62
- PseudoLoweringEmitter (RecordKeeper &R) : Records(R), Target(R) {}
62
+ PseudoLoweringEmitter (const RecordKeeper &R) : Records(R), Target(R) {}
63
63
64
64
// / run - Output the pseudo-lowerings.
65
65
void run (raw_ostream &o);
@@ -69,13 +69,12 @@ class PseudoLoweringEmitter {
69
69
// FIXME: This pass currently can only expand a pseudo to a single instruction.
70
70
// The pseudo expansion really should take a list of dags, not just
71
71
// a single dag, so we can do fancier things.
72
-
73
72
unsigned PseudoLoweringEmitter::addDagOperandMapping (
74
- Record *Rec, DagInit *Dag, CodeGenInstruction &Insn,
73
+ const Record *Rec, const DagInit *Dag, const CodeGenInstruction &Insn,
75
74
IndexedMap<OpData> &OperandMap, unsigned BaseIdx) {
76
75
unsigned OpsAdded = 0 ;
77
76
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))) {
79
78
// Physical register reference. Explicit check for the special case
80
79
// "zero_reg" definition.
81
80
if (DI->getDef ()->isSubClassOf (" Register" ) ||
@@ -105,17 +104,15 @@ unsigned PseudoLoweringEmitter::addDagOperandMapping(
105
104
for (unsigned I = 0 , E = Insn.Operands [i].MINumOperands ; I != E; ++I)
106
105
OperandMap[BaseIdx + i + I].Kind = OpData::Operand;
107
106
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))) {
109
108
OperandMap[BaseIdx + i].Kind = OpData::Imm;
110
109
OperandMap[BaseIdx + i].Data .Imm = II->getValue ();
111
110
++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))) {
115
112
OperandMap[BaseIdx + i].Kind = OpData::Imm;
116
- OperandMap[BaseIdx + i].Data .Imm = II-> getValue ();
113
+ OperandMap[BaseIdx + i].Data .Imm = *BI-> convertInitializerToInt ();
117
114
++OpsAdded;
118
- } else if (DagInit *SubDag = dyn_cast<DagInit>(Dag->getArg (i))) {
115
+ } else if (const DagInit *SubDag = dyn_cast<DagInit>(Dag->getArg (i))) {
119
116
// Just add the operands recursively. This is almost certainly
120
117
// a constant value for a complex operand (> 1 MI operand).
121
118
unsigned NewOps =
@@ -129,23 +126,23 @@ unsigned PseudoLoweringEmitter::addDagOperandMapping(
129
126
return OpsAdded;
130
127
}
131
128
132
- void PseudoLoweringEmitter::evaluateExpansion (Record *Rec) {
129
+ void PseudoLoweringEmitter::evaluateExpansion (const Record *Rec) {
133
130
LLVM_DEBUG (dbgs () << " Pseudo definition: " << Rec->getName () << " \n " );
134
131
135
132
// Validate that the result pattern has the corrent number and types
136
133
// of arguments for the instruction it references.
137
- DagInit *Dag = Rec->getValueAsDag (" ResultInst" );
134
+ const DagInit *Dag = Rec->getValueAsDag (" ResultInst" );
138
135
assert (Dag && " Missing result instruction in pseudo expansion!" );
139
136
LLVM_DEBUG (dbgs () << " Result: " << *Dag << " \n " );
140
137
141
- DefInit *OpDef = dyn_cast<DefInit>(Dag->getOperator ());
138
+ const DefInit *OpDef = dyn_cast<DefInit>(Dag->getOperator ());
142
139
if (!OpDef) {
143
140
PrintError (Rec, " In pseudo instruction '" + Rec->getName () +
144
141
" ', result operator is not a record" );
145
142
PrintFatalNote (Rec->getValue (" ResultInst" ),
146
143
" Result was assigned at the following location:" );
147
144
}
148
- Record *Operator = OpDef->getDef ();
145
+ const Record *Operator = OpDef->getDef ();
149
146
if (!Operator->isSubClassOf (" Instruction" )) {
150
147
PrintError (Rec, " In pseudo instruction '" + Rec->getName () +
151
148
" ', result operator '" + Operator->getName () +
@@ -173,8 +170,8 @@ void PseudoLoweringEmitter::evaluateExpansion(Record *Rec) {
173
170
}
174
171
175
172
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 ;
178
175
IndexedMap<OpData> OperandMap;
179
176
OperandMap.grow (NumMIOperands);
180
177
@@ -192,8 +189,8 @@ void PseudoLoweringEmitter::evaluateExpansion(Record *Rec) {
192
189
// the lowering emitter.
193
190
CodeGenInstruction SourceInsn (Rec);
194
191
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 ;
197
194
198
195
LLVM_DEBUG (dbgs () << " Operand mapping:\n " );
199
196
for (unsigned i = 0 , e = Insn.Operands .size (); i != e; ++i) {
@@ -265,7 +262,7 @@ void PseudoLoweringEmitter::emitLoweringEmitter(raw_ostream &o) {
265
262
<< Expansion.OperandMap [MIOpNo + i].Data .Imm << " ));\n " ;
266
263
break ;
267
264
case OpData::Reg: {
268
- Record *Reg = Expansion.OperandMap [MIOpNo + i].Data .Reg ;
265
+ const Record *Reg = Expansion.OperandMap [MIOpNo + i].Data .Reg ;
269
266
o << " Inst.addOperand(MCOperand::createReg(" ;
270
267
// "zero_reg" is special.
271
268
if (Reg->getName () == " zero_reg" )
@@ -297,19 +294,18 @@ void PseudoLoweringEmitter::emitLoweringEmitter(raw_ostream &o) {
297
294
o << " \n }\n\n " ;
298
295
}
299
296
300
- void PseudoLoweringEmitter::run (raw_ostream &o ) {
297
+ void PseudoLoweringEmitter::run (raw_ostream &OS ) {
301
298
StringRef Classes[] = {" PseudoInstExpansion" , " Instruction" };
302
- std::vector<Record *> Insts = Records.getAllDerivedDefinitions (Classes);
303
299
304
300
// Process the pseudo expansion definitions, validating them as we do so.
305
301
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 );
308
304
309
305
// Generate expansion code to lower the pseudo to an MCInst of the real
310
306
// instruction.
311
307
Records.startTimer (" Emit expansion code" );
312
- emitLoweringEmitter (o );
308
+ emitLoweringEmitter (OS );
313
309
}
314
310
315
311
static TableGen::Emitter::OptClass<PseudoLoweringEmitter>
0 commit comments