Report errors correctly for unselected target intrinsics.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 15 Oct 2009 18:50:03 +0000 (18:50 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 15 Oct 2009 18:50:03 +0000 (18:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84193 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAG.cpp
utils/TableGen/CodeGenDAGPatterns.h
utils/TableGen/DAGISelEmitter.cpp

index 542bf647eb0feee5ead512e5f7fe3490fbbd81c7..8bd0370cc60a0acacd09299c77ec9fd463f67b70 100644 (file)
@@ -30,6 +30,7 @@
 #include "llvm/Target/TargetLowering.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Target/TargetInstrInfo.h"
+#include "llvm/Target/TargetIntrinsicInfo.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -5404,14 +5405,16 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
   case ISD::EH_RETURN: return "EH_RETURN";
   case ISD::ConstantPool:  return "ConstantPool";
   case ISD::ExternalSymbol: return "ExternalSymbol";
-  case ISD::INTRINSIC_WO_CHAIN: {
-    unsigned IID = cast<ConstantSDNode>(getOperand(0))->getZExtValue();
-    return Intrinsic::getName((Intrinsic::ID)IID);
-  }
+  case ISD::INTRINSIC_WO_CHAIN:
   case ISD::INTRINSIC_VOID:
   case ISD::INTRINSIC_W_CHAIN: {
-    unsigned IID = cast<ConstantSDNode>(getOperand(1))->getZExtValue();
-    return Intrinsic::getName((Intrinsic::ID)IID);
+    unsigned OpNo = getOpcode() == ISD::INTRINSIC_WO_CHAIN ? 0 : 1;
+    unsigned IID = cast<ConstantSDNode>(getOperand(OpNo))->getZExtValue();
+    if (IID < Intrinsic::num_intrinsics)
+      return Intrinsic::getName((Intrinsic::ID)IID);
+    else if (const TargetIntrinsicInfo *TII = G->getTarget().getIntrinsicInfo())
+      return TII->getName(IID);
+    llvm_unreachable("Invalid intrinsic ID");
   }
 
   case ISD::BUILD_VECTOR:   return "BUILD_VECTOR";
index 9b53ecc5db95802910e1f81a9ec05d9f634ec0d9..398764b30a0973281e93f45d8dd3f0f4a17cb28f 100644 (file)
@@ -584,6 +584,8 @@ public:
     return intrinsic_wo_chain_sdnode;
   }
   
+  bool hasTargetIntrinsics() { return !TgtIntrinsics.empty(); }
+
 private:
   void ParseNodeInfo();
   void ParseNodeTransforms();
index dcf64e444c899e548b932292c7118088f02342aa..bbb8a18eec2cda25246d27cbd1971626ff355fc4 100644 (file)
@@ -2067,8 +2067,16 @@ void DAGISelEmitter::EmitInstructionSelector(raw_ostream &OS) {
      << "  errs() << \"Cannot yet select: \";\n"
      << "  unsigned iid = cast<ConstantSDNode>(N.getOperand("
      << "N.getOperand(0).getValueType() == MVT::Other))->getZExtValue();\n"
-     << " llvm_report_error(\"Cannot yet select: intrinsic %\" +\n"
-     << "Intrinsic::getName((Intrinsic::ID)iid));\n"
+     << "  if (iid < Intrinsic::num_intrinsics)\n"
+     << "    llvm_report_error(\"Cannot yet select: intrinsic %\" + "
+     << "Intrinsic::getName((Intrinsic::ID)iid));\n";
+  if (CGP.hasTargetIntrinsics()) {
+    OS << "  else if (const TargetIntrinsicInfo *tii = TM.getIntrinsicInfo())\n"
+       << "    llvm_report_error(Twine(\"Cannot yet select: target intrinsic "
+       << "%\") + tii->getName(iid));\n";
+  }
+  OS << "  else\n"
+     << "    llvm_report_error(\"Cannot yet select: invalid intrinsic\");\n"
      << "}\n\n";
 }