From: Chris Lattner Date: Mon, 5 Jan 2009 08:24:46 +0000 (+0000) Subject: Fix PR3281:crash08.ll with this diagnostic: X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=e914b59c008745204c49fcf0751f9cc4d91f44bb;p=oota-llvm.git Fix PR3281:crash08.ll with this diagnostic: 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 --- diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 93dbcd8c163..1a5a521b69f 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -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(LHS->getType()) && !LHS->getType()->isFloatingPoint() && - !isa(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; diff --git a/lib/AsmParser/LLParser.h b/lib/AsmParser/LLParser.h index 2ac92600a2d..f2c3187e9ef 100644 --- a/lib/AsmParser/LLParser.h +++ b/lib/AsmParser/LLParser.h @@ -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);