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:
parent
0088a5cc72
commit
e914b59c00
lib/AsmParser
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user