[llvm-commits] [llvm] r55374 - in /llvm/trunk: lib/Transforms/Scalar/LoopStrengthReduce.cpp test/Transforms/LoopStrengthReduce/2008-08-14-ShadowIV.ll
Evan Cheng
evan.cheng at apple.com
Tue Aug 26 23:50:13 PDT 2008
Hi Devang,
Please avoid the transformation is the int-to-float type is not
natively supported.
Thanks,
Evan
On Aug 26, 2008, at 10:58 AM, Devang Patel wrote:
> Author: dpatel
> Date: Tue Aug 26 12:57:54 2008
> New Revision: 55374
>
> URL: http://llvm.org/viewvc/llvm-project?rev=55374&view=rev
> Log:
> If IV is used in a int-to-float cast inside the loop then try to
> eliminate the cast operation.
>
> Modified:
> llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
> llvm/trunk/test/Transforms/LoopStrengthReduce/2008-08-14-
> ShadowIV.ll
>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=55374&r1=55373&r2=55374&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Tue Aug
> 26 12:57:54 2008
> @@ -45,6 +45,7 @@
> STATISTIC(NumInserted, "Number of PHIs inserted");
> STATISTIC(NumVariable, "Number of PHIs with variable strides");
> STATISTIC(NumEliminated , "Number of strides eliminated");
> +STATISTIC(NumShadow , "Number of Shadow IVs optimized");
>
> namespace {
>
> @@ -164,6 +165,7 @@
> AU.addRequired<DominatorTree>();
> AU.addRequired<TargetData>();
> AU.addRequired<ScalarEvolution>();
> + AU.addPreserved<ScalarEvolution>();
> }
>
> /// getCastedVersionOf - Return the specified value casted to
> uintptr_t.
> @@ -177,8 +179,13 @@
> IVStrideUse* &CondUse,
> const SCEVHandle* &CondStride);
> void OptimizeIndvars(Loop *L);
> +
> + /// OptimizeShadowIV - If IV is used in a int-to-float cast
> + /// inside the loop then try to eliminate the cast opeation.
> + void OptimizeShadowIV(Loop *L);
> +
> bool FindIVUserForCond(ICmpInst *Cond, IVStrideUse *&CondUse,
> - const SCEVHandle *&CondStride);
> + const SCEVHandle *&CondStride);
> bool RequiresTypeConversion(const Type *Ty, const Type *NewTy);
> unsigned CheckForIVReuse(bool, bool, const SCEVHandle&,
> IVExpr&, const Type*,
> @@ -1689,12 +1696,122 @@
> return Cond;
> }
>
> +/// OptimizeShadowIV - If IV is used in a int-to-float cast
> +/// inside the loop then try to eliminate the cast opeation.
> +void LoopStrengthReduce::OptimizeShadowIV(Loop *L) {
> +
> + SCEVHandle IterationCount = SE->getIterationCount(L);
> + if (isa<SCEVCouldNotCompute>(IterationCount))
> + return;
> +
> + for (unsigned Stride = 0, e = StrideOrder.size(); Stride != e;
> + ++Stride) {
> + std::map<SCEVHandle, IVUsersOfOneStride>::iterator SI =
> + IVUsesByStride.find(StrideOrder[Stride]);
> + assert(SI != IVUsesByStride.end() && "Stride doesn't exist!");
> + if (!isa<SCEVConstant>(SI->first))
> + continue;
> +
> + for (std::vector<IVStrideUse>::iterator UI = SI-
> >second.Users.begin(),
> + E = SI->second.Users.end(); UI != E; /* empty */) {
> + std::vector<IVStrideUse>::iterator CandidateUI = UI;
> + UI++;
> + Instruction *ShadowUse = CandidateUI->User;
> + const Type *DestTy = NULL;
> +
> + /* If shadow use is a int->float cast then insert a second IV
> + to elminate this cast.
> +
> + for (unsigned i = 0; i < n; ++i)
> + foo((double)i);
> +
> + is trnasformed into
> +
> + double d = 0.0;
> + for (unsigned i = 0; i < n; ++i, ++d)
> + foo(d);
> + */
> + UIToFPInst *UCast = dyn_cast<UIToFPInst>(CandidateUI->User);
> + if (UCast)
> + DestTy = UCast->getDestTy();
> + else {
> + SIToFPInst *SCast = dyn_cast<SIToFPInst>(CandidateUI->User);
> + if (!SCast) continue;
> + DestTy = SCast->getDestTy();
> + }
> +
> + PHINode *PH = dyn_cast<PHINode>(ShadowUse->getOperand(0));
> + if (!PH) continue;
> + if (PH->getNumIncomingValues() != 2) continue;
> +
> + const Type *SrcTy = PH->getType();
> + int Mantissa = DestTy->getFPMantissaWidth();
> + if (Mantissa == -1) continue;
> + if ((int)TD->getTypeSizeInBits(SrcTy) > Mantissa)
> + continue;
> +
> + unsigned Entry, Latch;
> + if (PH->getIncomingBlock(0) == L->getLoopPreheader()) {
> + Entry = 0;
> + Latch = 1;
> + } else {
> + Entry = 1;
> + Latch = 0;
> + }
> +
> + ConstantInt *Init = dyn_cast<ConstantInt>(PH-
> >getIncomingValue(Entry));
> + if (!Init) continue;
> + ConstantFP *NewInit = ConstantFP::get(DestTy, Init-
> >getZExtValue());
> +
> + BinaryOperator *Incr =
> + dyn_cast<BinaryOperator>(PH->getIncomingValue(Latch));
> + if (!Incr) continue;
> + if (Incr->getOpcode() != Instruction::Add
> + && Incr->getOpcode() != Instruction::Sub)
> + continue;
> +
> + /* Initialize new IV, double d = 0.0 in above example. */
> + ConstantInt *C = NULL;
> + if (Incr->getOperand(0) == PH)
> + C = dyn_cast<ConstantInt>(Incr->getOperand(1));
> + else if (Incr->getOperand(1) == PH)
> + C = dyn_cast<ConstantInt>(Incr->getOperand(0));
> + else
> + continue;
> +
> + if (!C) continue;
> +
> + /* Add new PHINode. */
> + PHINode *NewPH = PHINode::Create(DestTy, "IV.S.", PH);
> +
> + /* create new icnrement. '++d' in above example. */
> + ConstantFP *CFP = ConstantFP::get(DestTy, C->getZExtValue());
> + BinaryOperator *NewIncr =
> + BinaryOperator::Create(Incr->getOpcode(),
> + NewPH, CFP, "IV.S.next.", Incr);
> +
> + NewPH->addIncoming(NewInit, PH->getIncomingBlock(Entry));
> + NewPH->addIncoming(NewIncr, PH->getIncomingBlock(Latch));
> +
> + /* Remove cast operation */
> + SE->deleteValueFromRecords(ShadowUse);
> + ShadowUse->replaceAllUsesWith(NewPH);
> + ShadowUse->eraseFromParent();
> + SI->second.Users.erase(CandidateUI);
> + NumShadow++;
> + break;
> + }
> + }
> +}
> +
> // 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.
> void LoopStrengthReduce::OptimizeIndvars(Loop *L) {
> // TODO: implement optzns here.
>
> + OptimizeShadowIV(L);
> +
> // Finally, get the terminating condition for the loop if
> possible. If we
> // can, we want to change it to use a post-incremented version of
> its
> // induction variable, to allow coalescing the live ranges for the
> IV into
> @@ -1852,6 +1969,5 @@
> }
> DeleteTriviallyDeadInstructions(DeadInsts);
> }
> -
> return Changed;
> }
>
> Modified: llvm/trunk/test/Transforms/LoopStrengthReduce/2008-08-14-
> ShadowIV.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/2008-08-14-ShadowIV.ll?rev=55374&r1=55373&r2=55374&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/test/Transforms/LoopStrengthReduce/2008-08-14-
> ShadowIV.ll (original)
> +++ llvm/trunk/test/Transforms/LoopStrengthReduce/2008-08-14-
> ShadowIV.ll Tue Aug 26 12:57:54 2008
> @@ -1,5 +1,4 @@
> ; RUN: llvm-as < %s | opt -loop-reduce | llvm-dis | grep "phi
> double" | count 1
> -; XFAIL: *
>
> define void @foobar(i32 %n) nounwind {
> entry:
>
>
> _______________________________________________
> 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