[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