[SchedModel] Remove instregex entries that don't match any instructions

This patch throws a fatal error if an instregex entry doesn't actually match any instructions. This is part of the work to reduce the compile time impact of increased instregex usage (PR35955), although the x86 models seem to be relatively clean.

All the cases I encountered have now been fixed in trunk and this will ensure they don't get reintroduced.

Differential Revision: https://reviews.llvm.org/D44687

llvm-svn: 328459
This commit is contained in:
Simon Pilgrim 2018-03-25 19:20:08 +00:00
parent fecb0b7874
commit d044f9c9a7
1 changed files with 11 additions and 2 deletions

View File

@ -106,6 +106,8 @@ struct InstRegexOp : public SetTheory::Operator {
Regexpr = Regex(pat); Regexpr = Regex(pat);
} }
int NumMatches = 0;
unsigned NumGeneric = Target.getNumFixedInstructions(); unsigned NumGeneric = Target.getNumFixedInstructions();
ArrayRef<const CodeGenInstruction *> Generics = ArrayRef<const CodeGenInstruction *> Generics =
Target.getInstructionsByEnumValue().slice(0, NumGeneric + 1); Target.getInstructionsByEnumValue().slice(0, NumGeneric + 1);
@ -114,8 +116,10 @@ struct InstRegexOp : public SetTheory::Operator {
for (auto *Inst : Generics) { for (auto *Inst : Generics) {
StringRef InstName = Inst->TheDef->getName(); StringRef InstName = Inst->TheDef->getName();
if (InstName.startswith(Prefix) && if (InstName.startswith(Prefix) &&
(!Regexpr || Regexpr->match(InstName.substr(Prefix.size())))) (!Regexpr || Regexpr->match(InstName.substr(Prefix.size())))) {
Elts.insert(Inst->TheDef); Elts.insert(Inst->TheDef);
NumMatches++;
}
} }
ArrayRef<const CodeGenInstruction *> Instructions = ArrayRef<const CodeGenInstruction *> Instructions =
@ -139,9 +143,14 @@ struct InstRegexOp : public SetTheory::Operator {
// a regex that needs to be checked. // a regex that needs to be checked.
for (auto *Inst : make_range(Range)) { for (auto *Inst : make_range(Range)) {
StringRef InstName = Inst->TheDef->getName(); StringRef InstName = Inst->TheDef->getName();
if (!Regexpr || Regexpr->match(InstName.substr(Prefix.size()))) if (!Regexpr || Regexpr->match(InstName.substr(Prefix.size()))) {
Elts.insert(Inst->TheDef); Elts.insert(Inst->TheDef);
NumMatches++;
}
} }
if (0 == NumMatches)
PrintFatalError(Loc, "instregex has no matches: " + Original);
} }
} }
}; };