[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
Chris Lattner
lattner at cs.uiuc.edu
Thu May 25 16:24:49 PDT 2006
Changes in directory llvm/lib/Transforms/Scalar:
InstructionCombining.cpp updated: 1.484 -> 1.485
---
Log message:
Turn (cast (shuffle (cast)) -> shuffle (cast) if it reduces the # casts in
the program. This exposes more opportunities for the instcombiner, and implements
vec_shuffle.ll:test6
---
Diffs of the changes: (+31 -2)
InstructionCombining.cpp | 33 +++++++++++++++++++++++++++++++--
1 files changed, 31 insertions(+), 2 deletions(-)
Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.484 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.485
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.484 Thu May 25 17:53:38 2006
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Thu May 25 18:24:33 2006
@@ -413,7 +413,7 @@
if (V->getType()->isLosslesslyConvertibleTo(Ty))
return false;
- // If this is another cast that can be elimianted, it isn't codegen either.
+ // If this is another cast that can be eliminated, it isn't codegen either.
if (const CastInst *CI = dyn_cast<CastInst>(V))
if (isEliminableCastOfCast(CI->getOperand(0)->getType(), CI->getType(), Ty,
TD))
@@ -4970,7 +4970,7 @@
// If the source value is an instruction with only this use, we can attempt to
// propagate the cast into the instruction. Also, only handle integral types
// for now.
- if (Instruction *SrcI = dyn_cast<Instruction>(Src))
+ if (Instruction *SrcI = dyn_cast<Instruction>(Src)) {
if (SrcI->hasOneUse() && Src->getType()->isIntegral() &&
CI.getType()->isInteger()) { // Don't mess with casts to bool here
@@ -5152,6 +5152,35 @@
break;
}
}
+
+ if (SrcI->hasOneUse()) {
+ if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(SrcI)) {
+ // Okay, we have (cast (shuffle ..)). We know this cast is a bitconvert
+ // because the inputs are known to be a vector. Check to see if this is
+ // a cast to a vector with the same # elts.
+ if (isa<PackedType>(CI.getType()) &&
+ cast<PackedType>(CI.getType())->getNumElements() ==
+ SVI->getType()->getNumElements()) {
+ CastInst *Tmp;
+ // If either of the operands is a cast from CI.getType(), then
+ // evaluating the shuffle in the casted destination's type will allow
+ // us to eliminate at least one cast.
+ if (((Tmp = dyn_cast<CastInst>(SVI->getOperand(0))) &&
+ Tmp->getOperand(0)->getType() == CI.getType()) ||
+ ((Tmp = dyn_cast<CastInst>(SVI->getOperand(1))) &&
+ Tmp->getOperand(1)->getType() == CI.getType())) {
+ Value *LHS = InsertOperandCastBefore(SVI->getOperand(0),
+ CI.getType(), &CI);
+ Value *RHS = InsertOperandCastBefore(SVI->getOperand(1),
+ CI.getType(), &CI);
+ // Return a new shuffle vector. Use the same element ID's, as we
+ // know the vector types match #elts.
+ return new ShuffleVectorInst(LHS, RHS, SVI->getOperand(2));
+ }
+ }
+ }
+ }
+ }
return 0;
}
More information about the llvm-commits
mailing list