forked from OSchip/llvm-project
Get rid of a vector copy by just making a pointer out of the reference returned by getInstructionsByEnumValue instead of assigning it to a new vector.
llvm-svn: 200828
This commit is contained in:
parent
65efcb4685
commit
4c6129af32
|
@ -34,7 +34,7 @@ class AsmWriterEmitter {
|
|||
RecordKeeper &Records;
|
||||
CodeGenTarget Target;
|
||||
std::map<const CodeGenInstruction*, AsmWriterInst*> CGIAWIMap;
|
||||
std::vector<const CodeGenInstruction*> NumberedInstructions;
|
||||
const std::vector<const CodeGenInstruction*> *NumberedInstructions;
|
||||
std::vector<AsmWriterInst> Instructions;
|
||||
public:
|
||||
AsmWriterEmitter(RecordKeeper &R);
|
||||
|
@ -47,9 +47,9 @@ private:
|
|||
void EmitPrintAliasInstruction(raw_ostream &O);
|
||||
|
||||
AsmWriterInst *getAsmWriterInstByID(unsigned ID) const {
|
||||
assert(ID < NumberedInstructions.size());
|
||||
assert(ID < NumberedInstructions->size());
|
||||
std::map<const CodeGenInstruction*, AsmWriterInst*>::const_iterator I =
|
||||
CGIAWIMap.find(NumberedInstructions[ID]);
|
||||
CGIAWIMap.find(NumberedInstructions->at(ID));
|
||||
assert(I != CGIAWIMap.end() && "Didn't find inst!");
|
||||
return I->second;
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ void AsmWriterEmitter::
|
|||
FindUniqueOperandCommands(std::vector<std::string> &UniqueOperandCommands,
|
||||
std::vector<unsigned> &InstIdxs,
|
||||
std::vector<unsigned> &InstOpsUsed) const {
|
||||
InstIdxs.assign(NumberedInstructions.size(), ~0U);
|
||||
InstIdxs.assign(NumberedInstructions->size(), ~0U);
|
||||
|
||||
// This vector parallels UniqueOperandCommands, keeping track of which
|
||||
// instructions each case are used for. It is a comma separated string of
|
||||
|
@ -150,7 +150,7 @@ FindUniqueOperandCommands(std::vector<std::string> &UniqueOperandCommands,
|
|||
InstrsForCase.resize(UniqueOperandCommands.size());
|
||||
InstOpsUsed.assign(UniqueOperandCommands.size(), 0);
|
||||
|
||||
for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) {
|
||||
for (unsigned i = 0, e = NumberedInstructions->size(); i != e; ++i) {
|
||||
const AsmWriterInst *Inst = getAsmWriterInstByID(i);
|
||||
if (Inst == 0) continue; // PHI, INLINEASM, PROLOG_LABEL, etc.
|
||||
|
||||
|
@ -298,8 +298,8 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
|
|||
|
||||
// Add all strings to the string table upfront so it can generate an optimized
|
||||
// representation.
|
||||
for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) {
|
||||
AsmWriterInst *AWI = CGIAWIMap[NumberedInstructions[i]];
|
||||
for (unsigned i = 0, e = NumberedInstructions->size(); i != e; ++i) {
|
||||
AsmWriterInst *AWI = CGIAWIMap[NumberedInstructions->at(i)];
|
||||
if (AWI != 0 &&
|
||||
AWI->Operands[0].OperandType ==
|
||||
AsmWriterOperand::isLiteralTextOperand &&
|
||||
|
@ -313,8 +313,8 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
|
|||
StringTable.layout();
|
||||
|
||||
unsigned MaxStringIdx = 0;
|
||||
for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) {
|
||||
AsmWriterInst *AWI = CGIAWIMap[NumberedInstructions[i]];
|
||||
for (unsigned i = 0, e = NumberedInstructions->size(); i != e; ++i) {
|
||||
AsmWriterInst *AWI = CGIAWIMap[NumberedInstructions->at(i)];
|
||||
unsigned Idx;
|
||||
if (AWI == 0) {
|
||||
// Something not handled by the asmwriter printer.
|
||||
|
@ -376,7 +376,7 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
|
|||
BitsLeft -= NumBits;
|
||||
|
||||
// Remove the info about this operand.
|
||||
for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) {
|
||||
for (unsigned i = 0, e = NumberedInstructions->size(); i != e; ++i) {
|
||||
if (AsmWriterInst *Inst = getAsmWriterInstByID(i))
|
||||
if (!Inst->Operands.empty()) {
|
||||
unsigned NumOps = NumInstOpsHandled[InstIdxs[i]];
|
||||
|
@ -395,9 +395,9 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
|
|||
// We always emit at least one 32-bit table. A second table is emitted if
|
||||
// more bits are needed.
|
||||
O<<" static const uint32_t OpInfo[] = {\n";
|
||||
for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) {
|
||||
for (unsigned i = 0, e = NumberedInstructions->size(); i != e; ++i) {
|
||||
O << " " << (OpcodeInfo[i] & 0xffffffff) << "U,\t// "
|
||||
<< NumberedInstructions[i]->TheDef->getName() << "\n";
|
||||
<< NumberedInstructions->at(i)->TheDef->getName() << "\n";
|
||||
}
|
||||
// Add a dummy entry so the array init doesn't end with a comma.
|
||||
O << " 0U\n";
|
||||
|
@ -409,9 +409,9 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
|
|||
O << " static const uint"
|
||||
<< ((BitsLeft < 16) ? "32" : (BitsLeft < 24) ? "16" : "8")
|
||||
<< "_t OpInfo2[] = {\n";
|
||||
for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) {
|
||||
for (unsigned i = 0, e = NumberedInstructions->size(); i != e; ++i) {
|
||||
O << " " << (OpcodeInfo[i] >> 32) << "U,\t// "
|
||||
<< NumberedInstructions[i]->TheDef->getName() << "\n";
|
||||
<< NumberedInstructions->at(i)->TheDef->getName() << "\n";
|
||||
}
|
||||
// Add a dummy entry so the array init doesn't end with a comma.
|
||||
O << " 0U\n";
|
||||
|
@ -984,7 +984,7 @@ AsmWriterEmitter::AsmWriterEmitter(RecordKeeper &R) : Records(R), Target(R) {
|
|||
AsmWriter->getValueAsInt("OperandSpacing")));
|
||||
|
||||
// Get the instruction numbering.
|
||||
NumberedInstructions = Target.getInstructionsByEnumValue();
|
||||
NumberedInstructions = &Target.getInstructionsByEnumValue();
|
||||
|
||||
// Compute the CodeGenInstruction -> AsmWriterInst mapping. Note that not
|
||||
// all machine instructions are necessarily being printed, so there may be
|
||||
|
|
Loading…
Reference in New Issue