[llvm-commits] [llvm] r55913 - /llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
Evan Cheng
evan.cheng at apple.com
Mon Sep 8 10:13:22 PDT 2008
Now NumIVType is defined but not used.
Evan
On Sep 8, 2008, at 9:13 AM, Devang Patel wrote:
> Author: dpatel
> Date: Mon Sep 8 11:13:27 2008
> New Revision: 55913
>
> URL: http://llvm.org/viewvc/llvm-project?rev=55913&view=rev
> Log:
> Remove OptimizeIVType()
>
> Modified:
> llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=55913&r1=55912&r2=55913&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Mon Sep
> 8 11:13:27 2008
> @@ -185,10 +185,6 @@
> /// inside the loop then try to eliminate the cast opeation.
> void OptimizeShadowIV(Loop *L);
>
> - /// OptimizeIVType - If IV is always sext'ed or zext'ed then
> - /// change the type of IV, if possible.
> - void OptimizeIVType(Loop *L);
> -
> bool FindIVUserForCond(ICmpInst *Cond, IVStrideUse *&CondUse,
> const SCEVHandle *&CondStride);
> bool RequiresTypeConversion(const Type *Ty, const Type *NewTy);
> @@ -1813,206 +1809,6 @@
> }
> }
>
> -/// suitableExtInstruction - Helper function used by OptimizeIVType.
> -/// If I is a suitable SEXT or ZEXT instruction then return type
> -/// to which I is extended to. Otherwise return NULL.
> -const Type *suitableExtInstruction(Instruction *I, bool isSigned,
> - const Type *ExtType) {
> -
> - const Type *DestType = NULL;
> - if (ZExtInst *ZI = dyn_cast<ZExtInst>(I))
> - DestType = ZI->getDestTy();
> - else if (SExtInst *SI = dyn_cast<SExtInst>(I)) {
> - // If the inital value is signed then this is not suitable for
> - // OptimizeIVType transformation.
> - if (isSigned)
> - return NULL;
> - DestType = SI->getDestTy();
> - }
> -
> - if (!DestType) return NULL;
> -
> - if (!ExtType)
> - return DestType;
> -
> - // If another use of IV extended to some other type then the IV
> is not
> - // suitable for OptimizeIVType transformation.
> - if (ExtType != DestType)
> - return NULL;
> -
> - return DestType;
> -}
> -
> -/// suitableIVIncr - Helper function used by OptimizeIVType. If I is
> -/// a suitable binary operator whose all uses are either SEXT or ZEXT
> -/// then return the type to which all uses are extended to. Otherwise
> -/// return NULL.
> -const Type *suitableIVIncr(Instruction *I,
> - Instruction *PHI, bool isSigned,
> - const Type *ExtType) {
> -
> - BinaryOperator *Incr = dyn_cast<BinaryOperator>(I);
> - if (!Incr) return NULL;
> -
> - if (Incr->getOpcode() != Instruction::Add)
> - return NULL;
> -
> - ConstantInt *C = NULL;
> - if (Incr->getOperand(0) == PHI)
> - C = dyn_cast<ConstantInt>(Incr->getOperand(1));
> - else if (Incr->getOperand(1) == PHI)
> - C = dyn_cast<ConstantInt>(Incr->getOperand(0));
> -
> - if (!C) return NULL;
> -
> - const Type *RExtType = NULL;
> - for (Value::use_iterator IncUI = Incr->use_begin(),
> - IncUE = Incr->use_end(); IncUI != IncUE; ++IncUI) {
> -
> - Instruction *U2 = dyn_cast<Instruction>(*IncUI);
> - if (U2 == PHI)
> - continue;
> - const Type *DestType = suitableExtInstruction(U2, isSigned,
> ExtType);
> - if (!DestType)
> - return NULL;
> -
> - if (!RExtType)
> - RExtType = DestType;
> -
> - if (DestType != RExtType)
> - return NULL;
> - }
> -
> - return RExtType;
> -
> -}
> -
> -/// getNewPHIIncrement - Create a new increment instruction for
> newPHI
> -/// using type Ty based on increment instruction Incr.
> -/// Helper function used by OptimizeIVType.
> -BinaryOperator *getNewPHIIncrement(BinaryOperator *Incr, PHINode
> *PHI,
> - PHINode *NewPHI, const Type *Ty) {
> - ConstantInt *C = NULL;
> - if (Incr->getOperand(0) == PHI)
> - C = dyn_cast<ConstantInt>(Incr->getOperand(1));
> - else if (Incr->getOperand(1) == PHI)
> - C = dyn_cast<ConstantInt>(Incr->getOperand(0));
> -
> - assert (C && "Unexpected Incr operand!");
> - return BinaryOperator::Create(Incr->getOpcode(), NewPHI,
> - ConstantInt::get(Ty, C-
> >getZExtValue()),
> - "IV.next", Incr);
> -}
> -
> -/// OptimizeIVType - If IV is always sext'ed or zext'ed then
> -/// change the type of IV, if possible.
> -void LoopStrengthReduce::OptimizeIVType(Loop *L) {
> -
> - SCEVHandle IterationCount = SE->getIterationCount(L);
> - if (isa<SCEVCouldNotCompute>(IterationCount))
> - return;
> -
> - BasicBlock *LPH = L->getLoopPreheader();
> - BasicBlock *LatchBB = L->getLoopLatch();
> - SmallVector<PHINode *, 4> PHIs;
> - for (BasicBlock::iterator BI = L->getHeader()->begin(),
> - BE = L->getHeader()->end(); BI != BE; ++BI) {
> - if (PHINode *PHI = dyn_cast<PHINode>(BI))
> - PHIs.push_back(PHI);
> - else
> - break;
> - }
> -
> - while(!PHIs.empty()) {
> - PHINode *PHI = PHIs.back(); PHIs.pop_back();
> - if (PHI->getNumIncomingValues() != 2) continue;
> -
> - unsigned Entry = 0, Latch = 1;
> - if (PHI->getIncomingBlock(0) != LPH) {
> - Entry = 1;
> - Latch = 0;
> - }
> -
> - ConstantInt *CInit = dyn_cast<ConstantInt>(PHI-
> >getIncomingValue(Entry));
> - if (!CInit) return;
> - if (!CInit->isZero()) return;
> -
> - bool signedInit = CInit->getValue().isNegative();
> -
> - bool TransformPhi = true;
> - const Type *ExtType = NULL;
> - BinaryOperator *Incr = NULL;
> - SmallVector<Instruction *, 4> PHIUses;
> -
> - // Collect all IV uses.
> - for (Value::use_iterator UI = PHI->use_begin(),
> - UE = PHI->use_end(); UI != UE; ++UI) {
> - Instruction *Use = dyn_cast<Instruction>(*UI);
> - if (!Use) {
> - TransformPhi = false;
> - break;
> - }
> -
> - ExtType = suitableIVIncr(Use, PHI, signedInit, ExtType);
> - if (ExtType) {
> - Incr = cast<BinaryOperator>(Use);
> - continue;
> - }
> - ExtType = suitableExtInstruction(Use, signedInit, ExtType);
> - if (ExtType) {
> - PHIUses.push_back(Use);
> - continue;
> - }
> -
> - TransformPhi = false;
> - break;
> - }
> -
> - if (!TransformPhi || Incr == false || PHIUses.empty())
> - continue;
> -
> - // Apply transformation. Extend IV type and eliminate SEXT or
> ZEXT
> - // instructions.
> - NumIVType++;
> -
> - PHINode *NewPH = PHINode::Create(ExtType, "IV", PHI);
> - ConstantInt *NewCInit = ConstantInt::get(ExtType, CInit-
> >getZExtValue());
> - BinaryOperator *NewIncr = getNewPHIIncrement(Incr, PHI, NewPH,
> ExtType);
> -
> - NewPH->addIncoming(NewCInit, PHI->getIncomingBlock(Entry));
> - NewPH->addIncoming(NewIncr, PHI->getIncomingBlock(Latch));
> -
> - // Replace all SEXT or ZEXT uses with new IV directly.
> - while (!PHIUses.empty()) {
> - Instruction *Use = PHIUses.back(); PHIUses.pop_back();
> - SE->deleteValueFromRecords(Use);
> - Use->replaceAllUsesWith(NewPH);
> - Use->eraseFromParent();
> - }
> -
> - // Replace all uses of IV increment with new increment.
> - SmallVector<Instruction *, 2> IncrUses;
> - for (Value::use_iterator UI2 = Incr->use_begin(),
> - UE2 = Incr->use_end(); UI2 != UE2; ++UI2)
> - IncrUses.push_back(cast<Instruction>(*UI2));
> -
> - while (!IncrUses.empty()) {
> - Instruction *Use = IncrUses.back(); IncrUses.pop_back();
> - if (Use == PHI) continue;
> - SE->deleteValueFromRecords(Use);
> - Use->replaceAllUsesWith(NewIncr);
> - Use->eraseFromParent();
> - }
> -
> - // Remove old PHI and increment instruction.
> - SE->deleteValueFromRecords(PHI);
> - PHI->removeIncomingValue(LatchBB);
> - PHI->removeIncomingValue(LPH);
> - SE->deleteValueFromRecords(Incr);
> - Incr->eraseFromParent();
> - }
> -}
> -
> // OptimizeIndvars - Now that IVUsesByStride is set up with all of
> the indvar
> // uses in the loop, look to see if we can eliminate some, in favor
> of using
> // common indvars for the different uses.
> @@ -2082,8 +1878,6 @@
> UIntPtrTy = TD->getIntPtrType();
> Changed = false;
>
> - OptimizeIVType(L);
> -
> // Find all uses of induction variables in this loop, and catagorize
> // them by stride. Start by finding all of the PHI nodes in the
> header for
> // this loop. If they are induction variables, inspect their uses.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list