diff options
Diffstat (limited to 'lib/VMCore/Verifier.cpp')
| -rw-r--r-- | lib/VMCore/Verifier.cpp | 48 | 
1 files changed, 33 insertions, 15 deletions
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index 59ec3bee715a..b047d0c9fb6d 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -1069,13 +1069,40 @@ void Verifier::visitBinaryOperator(BinaryOperator &B) {            "Both operands to a binary operator are not of the same type!", &B);    switch (B.getOpcode()) { +  // Check that integer arithmetic operators are only used with +  // integral operands. +  case Instruction::Add: +  case Instruction::Sub: +  case Instruction::Mul: +  case Instruction::SDiv: +  case Instruction::UDiv: +  case Instruction::SRem: +  case Instruction::URem: +    Assert1(B.getType()->isIntOrIntVector(), +            "Integer arithmetic operators only work with integral types!", &B); +    Assert1(B.getType() == B.getOperand(0)->getType(), +            "Integer arithmetic operators must have same type " +            "for operands and result!", &B); +    break; +  // Check that floating-point arithmetic operators are only used with +  // floating-point operands. +  case Instruction::FAdd: +  case Instruction::FSub: +  case Instruction::FMul: +  case Instruction::FDiv: +  case Instruction::FRem: +    Assert1(B.getType()->isFPOrFPVector(), +            "Floating-point arithmetic operators only work with " +            "floating-point types!", &B); +    Assert1(B.getType() == B.getOperand(0)->getType(), +            "Floating-point arithmetic operators must have same type " +            "for operands and result!", &B); +    break;    // Check that logical operators are only used with integral operands.    case Instruction::And:    case Instruction::Or:    case Instruction::Xor: -    Assert1(B.getType()->isInteger() || -            (isa<VectorType>(B.getType()) &&  -             cast<VectorType>(B.getType())->getElementType()->isInteger()), +    Assert1(B.getType()->isIntOrIntVector(),              "Logical operators only work with integral types!", &B);      Assert1(B.getType() == B.getOperand(0)->getType(),              "Logical operators must have same type for operands and result!", @@ -1084,22 +1111,13 @@ void Verifier::visitBinaryOperator(BinaryOperator &B) {    case Instruction::Shl:    case Instruction::LShr:    case Instruction::AShr: -    Assert1(B.getType()->isInteger() || -            (isa<VectorType>(B.getType()) &&  -             cast<VectorType>(B.getType())->getElementType()->isInteger()), +    Assert1(B.getType()->isIntOrIntVector(),              "Shifts only work with integral types!", &B);      Assert1(B.getType() == B.getOperand(0)->getType(),              "Shift return type must be same as operands!", &B); -    /* FALL THROUGH */ -  default: -    // Arithmetic operators only work on integer or fp values -    Assert1(B.getType() == B.getOperand(0)->getType(), -            "Arithmetic operators must have same type for operands and result!", -            &B); -    Assert1(B.getType()->isInteger() || B.getType()->isFloatingPoint() || -            isa<VectorType>(B.getType()), -            "Arithmetic operators must have integer, fp, or vector type!", &B);      break; +  default: +    assert(0 && "Unknown BinaryOperator opcode!");    }    visitInstruction(B);  | 
