[PATCH] [TableGen] Sort intrinsics in reverse order for intrinsic name matcher
Justin Holewinski
justin.holewinski at gmail.com
Thu Jul 11 06:39:45 PDT 2013
jholewinski added you to the CC list for the revision "[TableGen] Sort intrinsics in reverse order for intrinsic name matcher".
Currently, TableGen may emit intrinsic name matchers in the form:
if (Name.startswith("abc.def")) ...
if (Name.startswith("abc.def.ghi")) ...
This clearly causes "abc.def.ghi" to never match, and erroneously selects "abc.def" instead.
http://llvm-reviews.chandlerc.com/D1128
Files:
utils/TableGen/IntrinsicEmitter.cpp
Index: utils/TableGen/IntrinsicEmitter.cpp
===================================================================
--- utils/TableGen/IntrinsicEmitter.cpp
+++ utils/TableGen/IntrinsicEmitter.cpp
@@ -131,6 +131,22 @@
OS << "#endif\n\n";
}
+struct IntrinsicNameSorter {
+ IntrinsicNameSorter(const std::vector<CodeGenIntrinsic> &I)
+ : Ints(I) {}
+
+ // Sort in reverse order of intrinsic name so "abc.def" appears after
+ // "abd.def.ghi" in the overridden name matcher
+ bool operator()(unsigned i, unsigned j) {
+ const std::string &IName = Ints[i].Name;
+ const std::string &JName = Ints[j].Name;
+ return IName.compare(JName) >= 0;
+ }
+
+private:
+ const std::vector<CodeGenIntrinsic>& Ints;
+};
+
void IntrinsicEmitter::
EmitFnNameRecognizer(const std::vector<CodeGenIntrinsic> &Ints,
raw_ostream &OS) {
@@ -144,12 +160,16 @@
OS << " StringRef NameR(Name+6, Len-6); // Skip over 'llvm.'\n";
OS << " switch (Name[5]) { // Dispatch on first letter.\n";
OS << " default: break;\n";
+ IntrinsicNameSorter Sorter(Ints);
// Emit the intrinsic matching stuff by first letter.
for (std::map<char, std::vector<unsigned> >::iterator I = IntMapping.begin(),
E = IntMapping.end(); I != E; ++I) {
OS << " case '" << I->first << "':\n";
std::vector<unsigned> &IntList = I->second;
+ // Sort intrinsics in reverse order of their names
+ std::sort(IntList.begin(), IntList.end(), Sorter);
+
// Emit all the overloaded intrinsics first, build a table of the
// non-overloaded ones.
std::vector<StringMatcher::StringPair> MatchTable;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1128.1.patch
Type: text/x-patch
Size: 1644 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130711/91adfa2c/attachment.bin>
More information about the llvm-commits
mailing list