[llvm-commits] [llvm] r154658 - /llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp

Craig Topper craig.topper at gmail.com
Thu Apr 12 23:14:57 PDT 2012


Author: ctopper
Date: Fri Apr 13 01:14:57 2012
New Revision: 154658

URL: http://llvm.org/viewvc/llvm-project?rev=154658&view=rev
Log:
Fix target specific intrinsic handling to adjust intrinsic number before doing attribute table lookup. Also fix attribute table lookup to handle 'invalid' intrinsic correctly. Fixes PR12542

Modified:
    llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp

Modified: llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp?rev=154658&r1=154657&r2=154658&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp Fri Apr 13 01:14:57 2012
@@ -537,7 +537,6 @@
   // at least one entry, for the function itself (index ~1), which is
   // usually nounwind.
   OS << "  static const uint8_t IntrinsicsToAttributesMap[] = {\n";
-  OS << "    255, // Invalid intrinsic\n";
 
   for (unsigned i = 0, e = Ints.size(); i != e; ++i) {
     const CodeGenIntrinsic &intrinsic = Ints[i];
@@ -549,11 +548,17 @@
 
   OS << "  AttributeWithIndex AWI[" << maxArgAttrs+1 << "];\n";
   OS << "  unsigned NumAttrs = 0;\n";
-  OS << "  switch(IntrinsicsToAttributesMap[id]) {\n";
-  OS << "  default: llvm_unreachable(\"Invalid attribute number\");\n";
+  OS << "  if (id != 0) {\n";
+  OS << "    switch(IntrinsicsToAttributesMap[id - ";
+  if (TargetOnly)
+    OS << "Intrinsic::num_intrinsics";
+  else
+    OS << "1";
+  OS << "]) {\n";
+  OS << "    default: llvm_unreachable(\"Invalid attribute number\");\n";
   for (UniqAttrMapTy::const_iterator I = UniqAttributes.begin(),
        E = UniqAttributes.end(); I != E; ++I) {
-    OS << "  case " << I->second << ":\n";
+    OS << "    case " << I->second << ":\n";
 
     const CodeGenIntrinsic &intrinsic = *(I->first);
 
@@ -564,7 +569,7 @@
     for (unsigned ai = 0, ae = intrinsic.ArgumentAttributes.size(); ai != ae;) {
       unsigned argNo = intrinsic.ArgumentAttributes[ai].first;
 
-      OS << "    AWI[" << numAttrs++ << "] = AttributeWithIndex::get("
+      OS << "      AWI[" << numAttrs++ << "] = AttributeWithIndex::get("
          << argNo+1 << ", ";
 
       bool moreThanOne = false;
@@ -588,7 +593,7 @@
     ModRefKind modRef = getModRefKind(intrinsic);
 
     if (!intrinsic.canThrow || modRef) {
-      OS << "    AWI[" << numAttrs++ << "] = AttributeWithIndex::get(~0, ";
+      OS << "      AWI[" << numAttrs++ << "] = AttributeWithIndex::get(~0, ";
       if (!intrinsic.canThrow) {
         OS << "Attribute::NoUnwind";
         if (modRef) OS << '|';
@@ -602,13 +607,14 @@
     }
 
     if (numAttrs) {
-      OS << "    NumAttrs = " << numAttrs << ";\n";
-      OS << "    break;\n";
+      OS << "      NumAttrs = " << numAttrs << ";\n";
+      OS << "      break;\n";
     } else {
-      OS << "    return AttrListPtr();\n";
+      OS << "      return AttrListPtr();\n";
     }
   }
   
+  OS << "    }\n";
   OS << "  }\n";
   OS << "  return AttrListPtr::get(AWI, NumAttrs);\n";
   OS << "}\n";





More information about the llvm-commits mailing list