Emit the intrinsic modref info as a lookup table instead of a huge switch.

Shrinks BasicAliasAnalysis.o from 106k to 56k on i386.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151781 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer
2012-03-01 01:18:32 +00:00
parent 275ff9bb17
commit b519a0fe0e

View File

@ -618,34 +618,36 @@ EmitAttributes(const std::vector<CodeGenIntrinsic> &Ints, raw_ostream &OS) {
/// EmitModRefBehavior - Determine intrinsic alias analysis mod/ref behavior. /// EmitModRefBehavior - Determine intrinsic alias analysis mod/ref behavior.
void IntrinsicEmitter:: void IntrinsicEmitter::
EmitModRefBehavior(const std::vector<CodeGenIntrinsic> &Ints, raw_ostream &OS){ EmitModRefBehavior(const std::vector<CodeGenIntrinsic> &Ints, raw_ostream &OS){
OS << "// Determine intrinsic alias analysis mod/ref behavior.\n"; OS << "// Determine intrinsic alias analysis mod/ref behavior.\n"
OS << "#ifdef GET_INTRINSIC_MODREF_BEHAVIOR\n"; << "#ifdef GET_INTRINSIC_MODREF_BEHAVIOR\n"
OS << "switch (iid) {\n"; << "assert(iid <= Intrinsic::" << Ints.back().EnumName << " && "
OS << "default:\n return UnknownModRefBehavior;\n"; << "\"Unknown intrinsic.\");\n\n";
OS << "static const uint8_t IntrinsicModRefBehavior[] = {\n"
<< " /* invalid */ UnknownModRefBehavior,\n";
for (unsigned i = 0, e = Ints.size(); i != e; ++i) { for (unsigned i = 0, e = Ints.size(); i != e; ++i) {
if (Ints[i].ModRef == CodeGenIntrinsic::ReadWriteMem) OS << " /* " << TargetPrefix << Ints[i].EnumName << " */ ";
continue;
OS << "case " << TargetPrefix << "Intrinsic::" << Ints[i].EnumName
<< ":\n";
switch (Ints[i].ModRef) { switch (Ints[i].ModRef) {
default:
assert(false && "Unknown Mod/Ref type!");
case CodeGenIntrinsic::NoMem: case CodeGenIntrinsic::NoMem:
OS << " return DoesNotAccessMemory;\n"; OS << "DoesNotAccessMemory,\n";
break; break;
case CodeGenIntrinsic::ReadArgMem: case CodeGenIntrinsic::ReadArgMem:
OS << " return OnlyReadsArgumentPointees;\n"; OS << "OnlyReadsArgumentPointees,\n";
break; break;
case CodeGenIntrinsic::ReadMem: case CodeGenIntrinsic::ReadMem:
OS << " return OnlyReadsMemory;\n"; OS << "OnlyReadsMemory,\n";
break; break;
case CodeGenIntrinsic::ReadWriteArgMem: case CodeGenIntrinsic::ReadWriteArgMem:
OS << " return OnlyAccessesArgumentPointees;\n"; OS << "OnlyAccessesArgumentPointees,\n";
break;
case CodeGenIntrinsic::ReadWriteMem:
OS << "UnknownModRefBehavior,\n";
break; break;
} }
} }
OS << "}\n"; OS << "};\n\n"
OS << "#endif // GET_INTRINSIC_MODREF_BEHAVIOR\n\n"; << "return static_cast<ModRefBehavior>(IntrinsicModRefBehavior[iid]);\n"
<< "#endif // GET_INTRINSIC_MODREF_BEHAVIOR\n\n";
} }
void IntrinsicEmitter:: void IntrinsicEmitter::