[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
Chris Lattner
sabre at nondot.org
Mon Nov 13 23:47:04 PST 2006
Changes in directory llvm/lib/Transforms/Scalar:
InstructionCombining.cpp updated: 1.543 -> 1.544
---
Log message:
implement InstCombine/shift-simplify.ll by transforming:
(X >> Z) op (Y >> Z) -> (X op Y) >> Z
for all shifts and all ops={and/or/xor}.
---
Diffs of the changes: (+46 -3)
InstructionCombining.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 46 insertions(+), 3 deletions(-)
Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.543 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.544
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.543 Tue Nov 14 00:06:06 2006
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Tue Nov 14 01:46:50 2006
@@ -3310,9 +3310,9 @@
}
// fold (and (cast A), (cast B)) -> (cast (and A, B))
- 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 (CastInst *Op0C = dyn_cast<CastInst>(Op0)) {
+ const Type *SrcTy = Op0C->getOperand(0)->getType();
if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() &&
// Only do this if the casts both really cause code to be generated.
ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) &&
@@ -3323,6 +3323,21 @@
InsertNewInstBefore(NewOp, I);
return new CastInst(NewOp, I.getType());
}
+ }
+ }
+
+ // (X >> Z) & (Y >> Z) -> (X&Y) >> Z for all shifts.
+ if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) {
+ if (ShiftInst *SI0 = dyn_cast<ShiftInst>(Op0))
+ if (SI0->getOpcode() == SI1->getOpcode() &&
+ SI0->getOperand(1) == SI1->getOperand(1) &&
+ (SI0->hasOneUse() || SI1->hasOneUse())) {
+ Instruction *NewOp =
+ InsertNewInstBefore(BinaryOperator::createAnd(SI0->getOperand(0),
+ SI1->getOperand(0),
+ SI0->getName()), I);
+ return new ShiftInst(SI1->getOpcode(), NewOp, SI1->getOperand(1));
+ }
}
return Changed ? &I : 0;
@@ -3567,6 +3582,20 @@
}
}
}
+
+ // (X >> Z) | (Y >> Z) -> (X|Y) >> Z for all shifts.
+ if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) {
+ if (ShiftInst *SI0 = dyn_cast<ShiftInst>(Op0))
+ if (SI0->getOpcode() == SI1->getOpcode() &&
+ SI0->getOperand(1) == SI1->getOperand(1) &&
+ (SI0->hasOneUse() || SI1->hasOneUse())) {
+ Instruction *NewOp =
+ InsertNewInstBefore(BinaryOperator::createOr(SI0->getOperand(0),
+ SI1->getOperand(0),
+ SI0->getName()), I);
+ return new ShiftInst(SI1->getOpcode(), NewOp, SI1->getOperand(1));
+ }
+ }
if (match(Op0, m_Not(m_Value(A)))) { // ~A | Op1
if (A == Op1) // ~A | A == -1
@@ -3879,6 +3908,20 @@
return new CastInst(NewOp, I.getType());
}
}
+
+ // (X >> Z) ^ (Y >> Z) -> (X^Y) >> Z for all shifts.
+ if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) {
+ if (ShiftInst *SI0 = dyn_cast<ShiftInst>(Op0))
+ if (SI0->getOpcode() == SI1->getOpcode() &&
+ SI0->getOperand(1) == SI1->getOperand(1) &&
+ (SI0->hasOneUse() || SI1->hasOneUse())) {
+ Instruction *NewOp =
+ InsertNewInstBefore(BinaryOperator::createXor(SI0->getOperand(0),
+ SI1->getOperand(0),
+ SI0->getName()), I);
+ return new ShiftInst(SI1->getOpcode(), NewOp, SI1->getOperand(1));
+ }
+ }
return Changed ? &I : 0;
}
More information about the llvm-commits
mailing list