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; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits