Fix PR3281:crash08.ll with this diagnostic:
authorChris Lattner <sabre@nondot.org>
Mon, 5 Jan 2009 08:24:46 +0000 (08:24 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 5 Jan 2009 08:24:46 +0000 (08:24 +0000)
llvm-as: crash08.ll:3:15: invalid operand type for instruction
  "qp" = sdiv fp128 0x1, %30
              ^

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61684 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AsmParser/LLParser.cpp
lib/AsmParser/LLParser.h

index 93dbcd8c1632fca5d5a29a4219582fa38d23b201..1a5a521b69f4651cc27b996c1c00fed8a70438f7 100644 (file)
@@ -2279,13 +2279,14 @@ bool LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB,
   // Binary Operators.
   case lltok::kw_add:
   case lltok::kw_sub:
-  case lltok::kw_mul:
+  case lltok::kw_mul:    return ParseArithmetic(Inst, PFS, Lex.getUIntVal(), 0);
+      
   case lltok::kw_udiv:
   case lltok::kw_sdiv:
-  case lltok::kw_fdiv:
   case lltok::kw_urem:
-  case lltok::kw_srem:
-  case lltok::kw_frem:   return ParseArithmetic(Inst, PFS, Lex.getUIntVal());
+  case lltok::kw_srem:   return ParseArithmetic(Inst, PFS, Lex.getUIntVal(), 1);
+  case lltok::kw_fdiv:
+  case lltok::kw_frem:   return ParseArithmetic(Inst, PFS, Lex.getUIntVal(), 2);
   case lltok::kw_shl:
   case lltok::kw_lshr:
   case lltok::kw_ashr:
@@ -2619,18 +2620,31 @@ bool LLParser::ParseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
 //===----------------------------------------------------------------------===//
 
 /// ParseArithmetic
-///  ::= ArithmeticOps TypeAndValue ',' Value {
+///  ::= ArithmeticOps TypeAndValue ',' Value
+///
+/// If OperandType is 0, then any FP or integer operand is allowed.  If it is 1,
+/// then any integer operand is allowed, if it is 2, any fp operand is allowed.
 bool LLParser::ParseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
-                               unsigned Opc) {
+                               unsigned Opc, unsigned OperandType) {
   LocTy Loc; Value *LHS, *RHS;
   if (ParseTypeAndValue(LHS, Loc, PFS) ||
       ParseToken(lltok::comma, "expected ',' in arithmetic operation") ||
       ParseValue(LHS->getType(), RHS, PFS))
     return true;
 
-  if (!isa<IntegerType>(LHS->getType()) && !LHS->getType()->isFloatingPoint() &&
-      !isa<VectorType>(LHS->getType()))
-    return Error(Loc, "instruction requires integer, fp, or vector operands");
+  bool Valid;
+  switch (OperandType) {
+  default: assert(0 && "Unknown operand type!");
+  case 0: // int or FP.
+    Valid = LHS->getType()->isIntOrIntVector() ||
+            LHS->getType()->isFPOrFPVector();
+    break;
+  case 1: Valid = LHS->getType()->isIntOrIntVector(); break;
+  case 2: Valid = LHS->getType()->isFPOrFPVector(); break;
+  }
+  
+  if (!Valid)
+    return Error(Loc, "invalid operand type for instruction");
   
   Inst = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS);
   return false;
index 2ac92600a2d53c2796d3b69993ac309cec9a383c..f2c3187e9ef4b291ae574d8fa6b7c4264a57ab04 100644 (file)
@@ -247,7 +247,8 @@ namespace llvm {
     bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS);
     bool ParseInvoke(Instruction *&Inst, PerFunctionState &PFS);
 
-    bool ParseArithmetic(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
+    bool ParseArithmetic(Instruction *&I, PerFunctionState &PFS, unsigned Opc,
+                         unsigned OperandType);
     bool ParseLogical(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
     bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
     bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc);