mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
Fix and/or/xor (cast A), (cast B) --> cast (and/or/xor A, B)
The cast patch introduced the possibility that the wrong cast opcode could be used and that this transform could trigger on different kinds of cast operations. This patch rectifies that. llvm-svn: 32538
This commit is contained in:
parent
d0bbb4e6dc
commit
32b08ba50f
@ -3270,22 +3270,21 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// fold (and (cast A), (cast B)) -> (cast (and A, B))
|
// fold (and (cast A), (cast B)) -> (cast (and A, B))
|
||||||
if (CastInst *Op1C = dyn_cast<CastInst>(Op1)) {
|
if (CastInst *Op0C = dyn_cast<CastInst>(Op0))
|
||||||
if (CastInst *Op0C = dyn_cast<CastInst>(Op0)) {
|
if (CastInst *Op1C = dyn_cast<CastInst>(Op1))
|
||||||
const Type *SrcTy = Op0C->getOperand(0)->getType();
|
if (Op0C->getOpcode() == Op1C->getOpcode()) { // same cast kind ?
|
||||||
if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() &&
|
const Type *SrcTy = Op0C->getOperand(0)->getType();
|
||||||
// Only do this if the casts both really cause code to be generated.
|
if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() &&
|
||||||
ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) &&
|
// Only do this if the casts both really cause code to be generated.
|
||||||
ValueRequiresCast(Op1C->getOperand(0), I.getType(), TD)) {
|
ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) &&
|
||||||
Instruction *NewOp = BinaryOperator::createAnd(Op0C->getOperand(0),
|
ValueRequiresCast(Op1C->getOperand(0), I.getType(), TD)) {
|
||||||
Op1C->getOperand(0),
|
Instruction *NewOp = BinaryOperator::createAnd(Op0C->getOperand(0),
|
||||||
I.getName());
|
Op1C->getOperand(0),
|
||||||
InsertNewInstBefore(NewOp, I);
|
I.getName());
|
||||||
return CastInst::createIntegerCast(NewOp, I.getType(),
|
InsertNewInstBefore(NewOp, I);
|
||||||
SrcTy->isSigned());
|
return CastInst::create(Op0C->getOpcode(), NewOp, I.getType());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// (X >> Z) & (Y >> Z) -> (X&Y) >> Z for all shifts.
|
// (X >> Z) & (Y >> Z) -> (X&Y) >> Z for all shifts.
|
||||||
if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) {
|
if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) {
|
||||||
@ -3675,21 +3674,21 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// fold (or (cast A), (cast B)) -> (cast (or A, B))
|
// fold (or (cast A), (cast B)) -> (cast (or A, B))
|
||||||
if (CastInst *Op0C = dyn_cast<CastInst>(Op0)) {
|
if (CastInst *Op0C = dyn_cast<CastInst>(Op0))
|
||||||
const Type *SrcTy = Op0C->getOperand(0)->getType();
|
|
||||||
if (CastInst *Op1C = dyn_cast<CastInst>(Op1))
|
if (CastInst *Op1C = dyn_cast<CastInst>(Op1))
|
||||||
if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() &&
|
if (Op0C->getOpcode() == Op1C->getOpcode()) {// same cast kind ?
|
||||||
// Only do this if the casts both really cause code to be generated.
|
const Type *SrcTy = Op0C->getOperand(0)->getType();
|
||||||
ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) &&
|
if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() &&
|
||||||
ValueRequiresCast(Op1C->getOperand(0), I.getType(), TD)) {
|
// Only do this if the casts both really cause code to be generated.
|
||||||
Instruction *NewOp = BinaryOperator::createOr(Op0C->getOperand(0),
|
ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) &&
|
||||||
Op1C->getOperand(0),
|
ValueRequiresCast(Op1C->getOperand(0), I.getType(), TD)) {
|
||||||
I.getName());
|
Instruction *NewOp = BinaryOperator::createOr(Op0C->getOperand(0),
|
||||||
InsertNewInstBefore(NewOp, I);
|
Op1C->getOperand(0),
|
||||||
return CastInst::createIntegerCast(NewOp, I.getType(),
|
I.getName());
|
||||||
SrcTy->isSigned());
|
InsertNewInstBefore(NewOp, I);
|
||||||
|
return CastInst::create(Op0C->getOpcode(), NewOp, I.getType());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return Changed ? &I : 0;
|
return Changed ? &I : 0;
|
||||||
@ -3857,21 +3856,21 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
|
|||||||
return R;
|
return R;
|
||||||
|
|
||||||
// fold (xor (cast A), (cast B)) -> (cast (xor A, B))
|
// fold (xor (cast A), (cast B)) -> (cast (xor A, B))
|
||||||
if (CastInst *Op0C = dyn_cast<CastInst>(Op0)) {
|
if (CastInst *Op0C = dyn_cast<CastInst>(Op0))
|
||||||
const Type *SrcTy = Op0C->getOperand(0)->getType();
|
|
||||||
if (CastInst *Op1C = dyn_cast<CastInst>(Op1))
|
if (CastInst *Op1C = dyn_cast<CastInst>(Op1))
|
||||||
if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() &&
|
if (Op0C->getOpcode() == Op1C->getOpcode()) { // same cast kind?
|
||||||
// Only do this if the casts both really cause code to be generated.
|
const Type *SrcTy = Op0C->getOperand(0)->getType();
|
||||||
ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) &&
|
if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() &&
|
||||||
ValueRequiresCast(Op1C->getOperand(0), I.getType(), TD)) {
|
// Only do this if the casts both really cause code to be generated.
|
||||||
Instruction *NewOp = BinaryOperator::createXor(Op0C->getOperand(0),
|
ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) &&
|
||||||
Op1C->getOperand(0),
|
ValueRequiresCast(Op1C->getOperand(0), I.getType(), TD)) {
|
||||||
I.getName());
|
Instruction *NewOp = BinaryOperator::createXor(Op0C->getOperand(0),
|
||||||
InsertNewInstBefore(NewOp, I);
|
Op1C->getOperand(0),
|
||||||
return CastInst::createIntegerCast(NewOp, I.getType(),
|
I.getName());
|
||||||
SrcTy->isSigned());
|
InsertNewInstBefore(NewOp, I);
|
||||||
|
return CastInst::create(Op0C->getOpcode(), NewOp, I.getType());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// (X >> Z) ^ (Y >> Z) -> (X^Y) >> Z for all shifts.
|
// (X >> Z) ^ (Y >> Z) -> (X^Y) >> Z for all shifts.
|
||||||
if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) {
|
if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user