change Target.getInstructionsByEnumValue to return a reference

to a vector that CGT stores instead of synthesizing it on every 
call.

llvm-svn: 98910
This commit is contained in:
Chris Lattner 2010-03-19 00:34:35 +00:00
parent 1734e47d20
commit 918be520dc
10 changed files with 41 additions and 37 deletions

View File

@ -845,8 +845,8 @@ void AsmMatcherInfo::BuildInfo(CodeGenTarget &Target) {
// singleton register classes. // singleton register classes.
std::set<std::string> SingletonRegisterNames; std::set<std::string> SingletonRegisterNames;
std::vector<const CodeGenInstruction*> InstrList; const std::vector<const CodeGenInstruction*> &InstrList =
Target.getInstructionsByEnumValue(InstrList); Target.getInstructionsByEnumValue();
for (unsigned i = 0, e = InstrList.size(); i != e; ++i) { for (unsigned i = 0, e = InstrList.size(); i != e; ++i) {
const CodeGenInstruction &CGI = *InstrList[i]; const CodeGenInstruction &CGI = *InstrList[i];

View File

@ -263,7 +263,7 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
AsmWriter->getValueAsInt("OperandSpacing"))); AsmWriter->getValueAsInt("OperandSpacing")));
// Get the instruction numbering. // Get the instruction numbering.
Target.getInstructionsByEnumValue(NumberedInstructions); NumberedInstructions = Target.getInstructionsByEnumValue();
// Compute the CodeGenInstruction -> AsmWriterInst mapping. Note that not // Compute the CodeGenInstruction -> AsmWriterInst mapping. Note that not
// all machine instructions are necessarily being printed, so there may be // all machine instructions are necessarily being printed, so there may be
@ -499,8 +499,8 @@ void AsmWriterEmitter::EmitGetInstructionName(raw_ostream &O) {
Record *AsmWriter = Target.getAsmWriter(); Record *AsmWriter = Target.getAsmWriter();
std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName"); std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName");
std::vector<const CodeGenInstruction*> NumberedInstructions; const std::vector<const CodeGenInstruction*> &NumberedInstructions =
Target.getInstructionsByEnumValue(NumberedInstructions); Target.getInstructionsByEnumValue();
StringToOffsetTable StringTable; StringToOffsetTable StringTable;
O << O <<

View File

@ -86,8 +86,8 @@ void CodeEmitterGen::run(raw_ostream &o) {
EmitSourceFileHeader("Machine Code Emitter", o); EmitSourceFileHeader("Machine Code Emitter", o);
std::string Namespace = Insts[0]->getValueAsString("Namespace") + "::"; std::string Namespace = Insts[0]->getValueAsString("Namespace") + "::";
std::vector<const CodeGenInstruction*> NumberedInstructions; const std::vector<const CodeGenInstruction*> &NumberedInstructions =
Target.getInstructionsByEnumValue(NumberedInstructions); Target.getInstructionsByEnumValue();
// Emit function declaration // Emit function declaration
o << "unsigned " << Target.getName() << "CodeEmitter::" o << "unsigned " << Target.getName() << "CodeEmitter::"
@ -95,7 +95,7 @@ void CodeEmitterGen::run(raw_ostream &o) {
// Emit instruction base values // Emit instruction base values
o << " static const unsigned InstBits[] = {\n"; o << " static const unsigned InstBits[] = {\n";
for (std::vector<const CodeGenInstruction*>::iterator for (std::vector<const CodeGenInstruction*>::const_iterator
IN = NumberedInstructions.begin(), IN = NumberedInstructions.begin(),
EN = NumberedInstructions.end(); EN = NumberedInstructions.end();
IN != EN; ++IN) { IN != EN; ++IN) {

View File

@ -2362,8 +2362,8 @@ void CodeGenDAGPatterns::AddPatternToMatch(const TreePattern *Pattern,
void CodeGenDAGPatterns::InferInstructionFlags() { void CodeGenDAGPatterns::InferInstructionFlags() {
std::vector<const CodeGenInstruction*> Instructions; const std::vector<const CodeGenInstruction*> &Instructions =
Target.getInstructionsByEnumValue(Instructions); Target.getInstructionsByEnumValue();
for (unsigned i = 0, e = Instructions.size(); i != e; ++i) { for (unsigned i = 0, e = Instructions.size(); i != e; ++i) {
CodeGenInstruction &InstInfo = CodeGenInstruction &InstInfo =
const_cast<CodeGenInstruction &>(*Instructions[i]); const_cast<CodeGenInstruction &>(*Instructions[i]);

View File

@ -300,11 +300,8 @@ GetInstByName(const char *Name,
/// getInstructionsByEnumValue - Return all of the instructions defined by the /// getInstructionsByEnumValue - Return all of the instructions defined by the
/// target, ordered by their enum value. /// target, ordered by their enum value.
void CodeGenTarget:: void CodeGenTarget::ComputeInstrsByEnum() {
getInstructionsByEnumValue(std::vector<const CodeGenInstruction*>
&NumberedInstructions) {
const std::map<std::string, CodeGenInstruction> &Insts = getInstructions(); const std::map<std::string, CodeGenInstruction> &Insts = getInstructions();
const CodeGenInstruction *PHI = GetInstByName("PHI", Insts); const CodeGenInstruction *PHI = GetInstByName("PHI", Insts);
const CodeGenInstruction *INLINEASM = GetInstByName("INLINEASM", Insts); const CodeGenInstruction *INLINEASM = GetInstByName("INLINEASM", Insts);
const CodeGenInstruction *DBG_LABEL = GetInstByName("DBG_LABEL", Insts); const CodeGenInstruction *DBG_LABEL = GetInstByName("DBG_LABEL", Insts);
@ -323,18 +320,18 @@ getInstructionsByEnumValue(std::vector<const CodeGenInstruction*>
const CodeGenInstruction *DBG_VALUE = GetInstByName("DBG_VALUE", Insts); const CodeGenInstruction *DBG_VALUE = GetInstByName("DBG_VALUE", Insts);
// Print out the rest of the instructions now. // Print out the rest of the instructions now.
NumberedInstructions.push_back(PHI); InstrsByEnum.push_back(PHI);
NumberedInstructions.push_back(INLINEASM); InstrsByEnum.push_back(INLINEASM);
NumberedInstructions.push_back(DBG_LABEL); InstrsByEnum.push_back(DBG_LABEL);
NumberedInstructions.push_back(EH_LABEL); InstrsByEnum.push_back(EH_LABEL);
NumberedInstructions.push_back(GC_LABEL); InstrsByEnum.push_back(GC_LABEL);
NumberedInstructions.push_back(KILL); InstrsByEnum.push_back(KILL);
NumberedInstructions.push_back(EXTRACT_SUBREG); InstrsByEnum.push_back(EXTRACT_SUBREG);
NumberedInstructions.push_back(INSERT_SUBREG); InstrsByEnum.push_back(INSERT_SUBREG);
NumberedInstructions.push_back(IMPLICIT_DEF); InstrsByEnum.push_back(IMPLICIT_DEF);
NumberedInstructions.push_back(SUBREG_TO_REG); InstrsByEnum.push_back(SUBREG_TO_REG);
NumberedInstructions.push_back(COPY_TO_REGCLASS); InstrsByEnum.push_back(COPY_TO_REGCLASS);
NumberedInstructions.push_back(DBG_VALUE); InstrsByEnum.push_back(DBG_VALUE);
for (inst_iterator II = inst_begin(), E = inst_end(); II != E; ++II) for (inst_iterator II = inst_begin(), E = inst_end(); II != E; ++II)
if (&II->second != PHI && if (&II->second != PHI &&
&II->second != INLINEASM && &II->second != INLINEASM &&
@ -348,7 +345,7 @@ getInstructionsByEnumValue(std::vector<const CodeGenInstruction*>
&II->second != SUBREG_TO_REG && &II->second != SUBREG_TO_REG &&
&II->second != COPY_TO_REGCLASS && &II->second != COPY_TO_REGCLASS &&
&II->second != DBG_VALUE) &II->second != DBG_VALUE)
NumberedInstructions.push_back(&II->second); InstrsByEnum.push_back(&II->second);
} }

View File

@ -70,6 +70,8 @@ class CodeGenTarget {
void ReadRegisterClasses() const; void ReadRegisterClasses() const;
void ReadInstructions() const; void ReadInstructions() const;
void ReadLegalValueTypes() const; void ReadLegalValueTypes() const;
std::vector<const CodeGenInstruction*> InstrsByEnum;
public: public:
CodeGenTarget(); CodeGenTarget();
@ -210,13 +212,18 @@ public:
/// getInstructionsByEnumValue - Return all of the instructions defined by the /// getInstructionsByEnumValue - Return all of the instructions defined by the
/// target, ordered by their enum value. /// target, ordered by their enum value.
void getInstructionsByEnumValue(std::vector<const CodeGenInstruction*> const std::vector<const CodeGenInstruction*> &getInstructionsByEnumValue() {
&NumberedInstructions); if (InstrsByEnum.empty()) ComputeInstrsByEnum();
return InstrsByEnum;
}
/// isLittleEndianEncoding - are instruction bit patterns defined as [0..n]? /// isLittleEndianEncoding - are instruction bit patterns defined as [0..n]?
/// ///
bool isLittleEndianEncoding() const; bool isLittleEndianEncoding() const;
private:
void ComputeInstrsByEnum();
}; };
/// ComplexPattern - ComplexPattern info, corresponding to the ComplexPattern /// ComplexPattern - ComplexPattern info, corresponding to the ComplexPattern

View File

@ -108,8 +108,8 @@ void DisassemblerEmitter::run(raw_ostream &OS) {
if (Target.getName() == "X86") { if (Target.getName() == "X86") {
DisassemblerTables Tables; DisassemblerTables Tables;
std::vector<const CodeGenInstruction*> numberedInstructions; const std::vector<const CodeGenInstruction*> &numberedInstructions =
Target.getInstructionsByEnumValue(numberedInstructions); Target.getInstructionsByEnumValue();
for (unsigned i = 0, e = numberedInstructions.size(); i != e; ++i) for (unsigned i = 0, e = numberedInstructions.size(); i != e; ++i)
RecognizableInstr::processInstr(Tables, *numberedInstructions[i], i); RecognizableInstr::processInstr(Tables, *numberedInstructions[i], i);

View File

@ -549,8 +549,8 @@ static void X86ExtractSemantics(FlagsConstantEmitter &instFlags,
/// @arg target - The CodeGenTarget to use as a source of instructions /// @arg target - The CodeGenTarget to use as a source of instructions
static void populateInstInfo(CompoundConstantEmitter &infoArray, static void populateInstInfo(CompoundConstantEmitter &infoArray,
CodeGenTarget &target) { CodeGenTarget &target) {
std::vector<const CodeGenInstruction*> numberedInstructions; const std::vector<const CodeGenInstruction*> &numberedInstructions =
target.getInstructionsByEnumValue(numberedInstructions); target.getInstructionsByEnumValue();
unsigned int index; unsigned int index;
unsigned int numInstructions = numberedInstructions.size(); unsigned int numInstructions = numberedInstructions.size();

View File

@ -40,8 +40,8 @@ void InstrEnumEmitter::run(raw_ostream &OS) {
exit(1); exit(1);
} }
std::vector<const CodeGenInstruction*> NumberedInstructions; const std::vector<const CodeGenInstruction*> &NumberedInstructions =
Target.getInstructionsByEnumValue(NumberedInstructions); Target.getInstructionsByEnumValue();
OS << "namespace " << Namespace << " {\n"; OS << "namespace " << Namespace << " {\n";
OS << " enum {\n"; OS << " enum {\n";

View File

@ -244,8 +244,8 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
// //
OS << "\nstatic const TargetInstrDesc " << TargetName OS << "\nstatic const TargetInstrDesc " << TargetName
<< "Insts[] = {\n"; << "Insts[] = {\n";
std::vector<const CodeGenInstruction*> NumberedInstructions; const std::vector<const CodeGenInstruction*> &NumberedInstructions =
Target.getInstructionsByEnumValue(NumberedInstructions); Target.getInstructionsByEnumValue();
for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i)
emitRecord(*NumberedInstructions[i], i, InstrInfo, EmittedLists, emitRecord(*NumberedInstructions[i], i, InstrInfo, EmittedLists,