mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
Get logical operations to like packed types, allow BinOp::getNot to create
the right vector of -1's as its operand. llvm-svn: 24906
This commit is contained in:
parent
15bf8f26f2
commit
d51de8d76f
@ -811,16 +811,17 @@ void BinaryOperator::init(BinaryOps iType)
|
||||
case Rem:
|
||||
assert(getType() == LHS->getType() &&
|
||||
"Arithmetic operation should return same type as operands!");
|
||||
assert((getType()->isInteger() ||
|
||||
getType()->isFloatingPoint() ||
|
||||
isa<PackedType>(getType()) ) &&
|
||||
assert((getType()->isInteger() || getType()->isFloatingPoint() ||
|
||||
isa<PackedType>(getType())) &&
|
||||
"Tried to create an arithmetic operation on a non-arithmetic type!");
|
||||
break;
|
||||
case And: case Or:
|
||||
case Xor:
|
||||
assert(getType() == LHS->getType() &&
|
||||
"Logical operation should return same type as operands!");
|
||||
assert(getType()->isIntegral() &&
|
||||
assert((getType()->isIntegral() ||
|
||||
(isa<PackedType>(getType()) &&
|
||||
cast<PackedType>(getType())->getElementType()->isIntegral())) &&
|
||||
"Tried to create a logical operation on a non-integral type!");
|
||||
break;
|
||||
case SetLT: case SetGT: case SetLE:
|
||||
@ -889,8 +890,17 @@ BinaryOperator *BinaryOperator::createNot(Value *Op, const std::string &Name,
|
||||
|
||||
BinaryOperator *BinaryOperator::createNot(Value *Op, const std::string &Name,
|
||||
BasicBlock *InsertAtEnd) {
|
||||
return new BinaryOperator(Instruction::Xor, Op,
|
||||
ConstantIntegral::getAllOnesValue(Op->getType()),
|
||||
Constant *AllOnes;
|
||||
if (const PackedType *PTy = dyn_cast<PackedType>(Op->getType())) {
|
||||
// Create a vector of all ones values.
|
||||
Constant *Elt = ConstantIntegral::getAllOnesValue(PTy->getElementType());
|
||||
AllOnes =
|
||||
ConstantPacked::get(std::vector<Constant*>(PTy->getNumElements(), Elt));
|
||||
} else {
|
||||
AllOnes = ConstantIntegral::getAllOnesValue(Op->getType());
|
||||
}
|
||||
|
||||
return new BinaryOperator(Instruction::Xor, Op, AllOnes,
|
||||
Op->getType(), Name, InsertAtEnd);
|
||||
}
|
||||
|
||||
|
@ -498,7 +498,9 @@ void Verifier::visitBinaryOperator(BinaryOperator &B) {
|
||||
// Check that logical operators are only used with integral operands.
|
||||
if (B.getOpcode() == Instruction::And || B.getOpcode() == Instruction::Or ||
|
||||
B.getOpcode() == Instruction::Xor) {
|
||||
Assert1(B.getType()->isIntegral(),
|
||||
Assert1(B.getType()->isIntegral() ||
|
||||
(isa<PackedType>(B.getType()) &&
|
||||
cast<PackedType>(B.getType())->getElementType()->isIntegral()),
|
||||
"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!",
|
||||
|
Loading…
Reference in New Issue
Block a user