1
0
mirror of https://github.com/RPCS3/llvm.git synced 2025-04-06 15:21:37 +00:00

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
This commit is contained in:
Chris Lattner 2009-01-05 08:24:46 +00:00
parent 0088a5cc72
commit e914b59c00
2 changed files with 25 additions and 10 deletions

@ -2279,13 +2279,14 @@ bool LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB,
// Binary Operators. // Binary Operators.
case lltok::kw_add: case lltok::kw_add:
case lltok::kw_sub: 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_udiv:
case lltok::kw_sdiv: case lltok::kw_sdiv:
case lltok::kw_fdiv:
case lltok::kw_urem: case lltok::kw_urem:
case lltok::kw_srem: case lltok::kw_srem: return ParseArithmetic(Inst, PFS, Lex.getUIntVal(), 1);
case lltok::kw_frem: return ParseArithmetic(Inst, PFS, Lex.getUIntVal()); case lltok::kw_fdiv:
case lltok::kw_frem: return ParseArithmetic(Inst, PFS, Lex.getUIntVal(), 2);
case lltok::kw_shl: case lltok::kw_shl:
case lltok::kw_lshr: case lltok::kw_lshr:
case lltok::kw_ashr: case lltok::kw_ashr:
@ -2619,18 +2620,31 @@ bool LLParser::ParseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
/// ParseArithmetic /// 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, bool LLParser::ParseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
unsigned Opc) { unsigned Opc, unsigned OperandType) {
LocTy Loc; Value *LHS, *RHS; LocTy Loc; Value *LHS, *RHS;
if (ParseTypeAndValue(LHS, Loc, PFS) || if (ParseTypeAndValue(LHS, Loc, PFS) ||
ParseToken(lltok::comma, "expected ',' in arithmetic operation") || ParseToken(lltok::comma, "expected ',' in arithmetic operation") ||
ParseValue(LHS->getType(), RHS, PFS)) ParseValue(LHS->getType(), RHS, PFS))
return true; return true;
if (!isa<IntegerType>(LHS->getType()) && !LHS->getType()->isFloatingPoint() && bool Valid;
!isa<VectorType>(LHS->getType())) switch (OperandType) {
return Error(Loc, "instruction requires integer, fp, or vector operands"); 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); Inst = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS);
return false; return false;

@ -247,7 +247,8 @@ namespace llvm {
bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS); bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS);
bool ParseInvoke(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 ParseLogical(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc); bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc); bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc);