[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
Chris Lattner
lattner at cs.uiuc.edu
Thu May 25 15:53:51 PDT 2006
Changes in directory llvm/lib/Transforms/Scalar:
InstructionCombining.cpp updated: 1.483 -> 1.484
---
Log message:
extract element from a shuffle vector can be trivially turned into an
extractelement from the SV's source. This implement vec_shuffle.ll:test[45]
---
Diffs of the changes: (+41 -12)
InstructionCombining.cpp | 53 ++++++++++++++++++++++++++++++++++++-----------
1 files changed, 41 insertions(+), 12 deletions(-)
Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.483 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.484
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.483 Sat May 20 18:14:03 2006
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Thu May 25 17:53:38 2006
@@ -7072,7 +7072,7 @@
return ReplaceInstUsesWith(EI, Elt);
}
- if (Instruction *I = dyn_cast<Instruction>(EI.getOperand(0)))
+ if (Instruction *I = dyn_cast<Instruction>(EI.getOperand(0))) {
if (I->hasOneUse()) {
// Push extractelement into predecessor operation if legal and
// profitable to do so
@@ -7097,20 +7097,49 @@
I->getName() + ".gep");
InsertNewInstBefore(GEP, EI);
return new LoadInst(GEP);
- } else if (InsertElementInst *IE = dyn_cast<InsertElementInst>(I)) {
- // Extracting the inserted element?
- if (IE->getOperand(2) == EI.getOperand(1))
- return ReplaceInstUsesWith(EI, IE->getOperand(1));
- // If the inserted and extracted elements are constants, they must not
- // be the same value, extract from the pre-inserted value instead.
- if (isa<Constant>(IE->getOperand(2)) &&
- isa<Constant>(EI.getOperand(1))) {
- AddUsesToWorkList(EI);
- EI.setOperand(0, IE->getOperand(0));
- return &EI;
+ }
+ }
+ if (InsertElementInst *IE = dyn_cast<InsertElementInst>(I)) {
+ // Extracting the inserted element?
+ if (IE->getOperand(2) == EI.getOperand(1))
+ return ReplaceInstUsesWith(EI, IE->getOperand(1));
+ // If the inserted and extracted elements are constants, they must not
+ // be the same value, extract from the pre-inserted value instead.
+ if (isa<Constant>(IE->getOperand(2)) &&
+ isa<Constant>(EI.getOperand(1))) {
+ AddUsesToWorkList(EI);
+ EI.setOperand(0, IE->getOperand(0));
+ return &EI;
+ }
+ } else if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(I)) {
+ // If this is extracting an element from a shufflevector, figure out where
+ // it came from and extract from the appropriate input element instead.
+ if (ConstantUInt *Elt = dyn_cast<ConstantUInt>(EI.getOperand(1))) {
+ unsigned ExtractedIdx = Elt->getValue();
+ if (ConstantPacked *CP = dyn_cast<ConstantPacked>(SVI->getOperand(2))) {
+ unsigned Idx = 0;
+ if (ConstantUInt *CI =
+ dyn_cast<ConstantUInt>(CP->getOperand(ExtractedIdx)))
+ Idx = CI->getValue();
+ Value *Src;
+ if (Idx < CP->getNumOperands())
+ Src = SVI->getOperand(0);
+ else {
+ Idx -= CP->getNumOperands();
+ Src = SVI->getOperand(0);
+ }
+ return new ExtractElementInst(Src,
+ ConstantUInt::get(Type::UIntTy, Idx));
+
+ } else if (isa<ConstantAggregateZero>(SVI->getOperand(2))) {
+ // If extracting from a splat of the 0th element, return an extract
+ // of the zero'th element of the input to the splat.
+ return new ExtractElementInst(SVI->getOperand(0),
+ ConstantUInt::get(Type::UIntTy, 0));
}
}
}
+ }
return 0;
}
More information about the llvm-commits
mailing list