[LLParser] Simplify type checking in ParseArithmetic and ParseUnaryOp.
Summary: These methods previously took a 0, 1, or 2 to indicate what types were allowed, but the 0 encoding which meant both fp and integer types has been unused for years. Its leftover from when add/sub/mul used to be shared between int and fp Simplify it by changing it to just a bool to distinquish int and fp. Reviewers: spatel, dblaikie, jyknight, arsenm Reviewed By: spatel Subscribers: wdng, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D61561 llvm-svn: 359986
This commit is contained in:
parent
41c999bcf5
commit
8279695d66
|
@ -5629,7 +5629,7 @@ int LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB,
|
|||
// Unary Operators.
|
||||
case lltok::kw_fneg: {
|
||||
FastMathFlags FMF = EatFastMathFlagsIfPresent();
|
||||
int Res = ParseUnaryOp(Inst, PFS, KeywordVal, 2);
|
||||
int Res = ParseUnaryOp(Inst, PFS, KeywordVal, /*IsFP*/true);
|
||||
if (Res != 0)
|
||||
return Res;
|
||||
if (FMF.any())
|
||||
|
@ -5645,7 +5645,7 @@ int LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB,
|
|||
bool NSW = EatIfPresent(lltok::kw_nsw);
|
||||
if (!NUW) NUW = EatIfPresent(lltok::kw_nuw);
|
||||
|
||||
if (ParseArithmetic(Inst, PFS, KeywordVal, 1)) return true;
|
||||
if (ParseArithmetic(Inst, PFS, KeywordVal, /*IsFP*/false)) return true;
|
||||
|
||||
if (NUW) cast<BinaryOperator>(Inst)->setHasNoUnsignedWrap(true);
|
||||
if (NSW) cast<BinaryOperator>(Inst)->setHasNoSignedWrap(true);
|
||||
|
@ -5657,7 +5657,7 @@ int LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB,
|
|||
case lltok::kw_fdiv:
|
||||
case lltok::kw_frem: {
|
||||
FastMathFlags FMF = EatFastMathFlagsIfPresent();
|
||||
int Res = ParseArithmetic(Inst, PFS, KeywordVal, 2);
|
||||
int Res = ParseArithmetic(Inst, PFS, KeywordVal, /*IsFP*/true);
|
||||
if (Res != 0)
|
||||
return Res;
|
||||
if (FMF.any())
|
||||
|
@ -5671,13 +5671,14 @@ int LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB,
|
|||
case lltok::kw_ashr: {
|
||||
bool Exact = EatIfPresent(lltok::kw_exact);
|
||||
|
||||
if (ParseArithmetic(Inst, PFS, KeywordVal, 1)) return true;
|
||||
if (ParseArithmetic(Inst, PFS, KeywordVal, /*IsFP*/false)) return true;
|
||||
if (Exact) cast<BinaryOperator>(Inst)->setIsExact(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
case lltok::kw_urem:
|
||||
case lltok::kw_srem: return ParseArithmetic(Inst, PFS, KeywordVal, 1);
|
||||
case lltok::kw_srem: return ParseArithmetic(Inst, PFS, KeywordVal,
|
||||
/*IsFP*/false);
|
||||
case lltok::kw_and:
|
||||
case lltok::kw_or:
|
||||
case lltok::kw_xor: return ParseLogical(Inst, PFS, KeywordVal);
|
||||
|
@ -6214,28 +6215,16 @@ bool LLParser::ParseCleanupPad(Instruction *&Inst, PerFunctionState &PFS) {
|
|||
/// ParseUnaryOp
|
||||
/// ::= UnaryOp 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.
|
||||
/// If IsFP is false, then any integer operand is allowed, if it is true, any fp
|
||||
/// operand is allowed.
|
||||
bool LLParser::ParseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
|
||||
unsigned Opc, unsigned OperandType) {
|
||||
unsigned Opc, bool IsFP) {
|
||||
LocTy Loc; Value *LHS;
|
||||
if (ParseTypeAndValue(LHS, Loc, PFS))
|
||||
return true;
|
||||
|
||||
bool Valid;
|
||||
switch (OperandType) {
|
||||
default: llvm_unreachable("Unknown operand type!");
|
||||
case 0: // int or FP.
|
||||
Valid = LHS->getType()->isIntOrIntVectorTy() ||
|
||||
LHS->getType()->isFPOrFPVectorTy();
|
||||
break;
|
||||
case 1:
|
||||
Valid = LHS->getType()->isIntOrIntVectorTy();
|
||||
break;
|
||||
case 2:
|
||||
Valid = LHS->getType()->isFPOrFPVectorTy();
|
||||
break;
|
||||
}
|
||||
bool Valid = IsFP ? LHS->getType()->isFPOrFPVectorTy()
|
||||
: LHS->getType()->isIntOrIntVectorTy();
|
||||
|
||||
if (!Valid)
|
||||
return Error(Loc, "invalid operand type for instruction");
|
||||
|
@ -6369,26 +6358,18 @@ bool LLParser::ParseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
|
|||
/// ParseArithmetic
|
||||
/// ::= 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.
|
||||
/// If IsFP is false, then any integer operand is allowed, if it is true, any fp
|
||||
/// operand is allowed.
|
||||
bool LLParser::ParseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
|
||||
unsigned Opc, unsigned OperandType) {
|
||||
unsigned Opc, bool IsFP) {
|
||||
LocTy Loc; Value *LHS, *RHS;
|
||||
if (ParseTypeAndValue(LHS, Loc, PFS) ||
|
||||
ParseToken(lltok::comma, "expected ',' in arithmetic operation") ||
|
||||
ParseValue(LHS->getType(), RHS, PFS))
|
||||
return true;
|
||||
|
||||
bool Valid;
|
||||
switch (OperandType) {
|
||||
default: llvm_unreachable("Unknown operand type!");
|
||||
case 0: // int or FP.
|
||||
Valid = LHS->getType()->isIntOrIntVectorTy() ||
|
||||
LHS->getType()->isFPOrFPVectorTy();
|
||||
break;
|
||||
case 1: Valid = LHS->getType()->isIntOrIntVectorTy(); break;
|
||||
case 2: Valid = LHS->getType()->isFPOrFPVectorTy(); break;
|
||||
}
|
||||
bool Valid = IsFP ? LHS->getType()->isFPOrFPVectorTy()
|
||||
: LHS->getType()->isIntOrIntVectorTy();
|
||||
|
||||
if (!Valid)
|
||||
return Error(Loc, "invalid operand type for instruction");
|
||||
|
|
|
@ -573,9 +573,9 @@ namespace llvm {
|
|||
bool ParseCallBr(Instruction *&Inst, PerFunctionState &PFS);
|
||||
|
||||
bool ParseUnaryOp(Instruction *&Inst, PerFunctionState &PFS, unsigned Opc,
|
||||
unsigned OperandType);
|
||||
bool IsFP);
|
||||
bool ParseArithmetic(Instruction *&Inst, PerFunctionState &PFS, unsigned Opc,
|
||||
unsigned OperandType);
|
||||
bool IsFP);
|
||||
bool ParseLogical(Instruction *&Inst, PerFunctionState &PFS, unsigned Opc);
|
||||
bool ParseCompare(Instruction *&Inst, PerFunctionState &PFS, unsigned Opc);
|
||||
bool ParseCast(Instruction *&Inst, PerFunctionState &PFS, unsigned Opc);
|
||||
|
|
Loading…
Reference in New Issue