[llvm-commits] [llvm] r140670 - /llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp

Cameron Zwarich zwarich at apple.com
Tue Sep 27 18:51:07 PDT 2011


Test case?

Cameron

On Sep 27, 2011, at 6:35 PM, Andrew Trick <atrick at apple.com> wrote:

> Author: atrick
> Date: Tue Sep 27 20:35:36 2011
> New Revision: 140670
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=140670&view=rev
> Log:
> indvars should hoist [sz]ext because licm is not rerun.
> 
> Modified:
>    llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp
> 
> Modified: llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp?rev=140670&r1=140669&r2=140670&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp Tue Sep 27 20:35:36 2011
> @@ -834,6 +834,9 @@
>   PHINode *CreateWideIV(SCEVExpander &Rewriter);
> 
> protected:
> +  Value *getExtend(Value *NarrowOper, Type *WideType, bool IsSigned,
> +                   Instruction *Use);
> +
>   Instruction *CloneIVUser(NarrowIVDefUse DU);
> 
>   const SCEVAddRecExpr *GetWideRecurrence(Instruction *NarrowUse);
> @@ -846,8 +849,27 @@
> };
> } // anonymous namespace
> 
> -static Value *getExtend( Value *NarrowOper, Type *WideType,
> -                               bool IsSigned, IRBuilder<> &Builder) {
> +/// isLoopInvariant - Perform a quick domtree based check for loop invariance
> +/// assuming that V is used within the loop. LoopInfo::isLoopInvariant() seems
> +/// gratuitous for this purpose.
> +static bool isLoopInvariant(Value *V, const Loop *L, const DominatorTree *DT) {
> +  Instruction *Inst = dyn_cast<Instruction>(V);
> +  if (!Inst)
> +    return true;
> +
> +  return DT->properlyDominates(Inst->getParent(), L->getHeader());
> +}
> +
> +Value *WidenIV::getExtend(Value *NarrowOper, Type *WideType, bool IsSigned,
> +                          Instruction *Use) {
> +  // Set the debug location and conservative insertion point.
> +  IRBuilder<> Builder(Use);
> +  // Hoist the insertion point into loop preheaders as far as possible.
> +  for (const Loop *L = LI->getLoopFor(Use->getParent());
> +       L && L->getLoopPreheader() && isLoopInvariant(NarrowOper, L, DT);
> +       L = L->getParentLoop())
> +    Builder.SetInsertPoint(L->getLoopPreheader()->getTerminator());
> +
>   return IsSigned ? Builder.CreateSExt(NarrowOper, WideType) :
>                     Builder.CreateZExt(NarrowOper, WideType);
> }
> @@ -872,22 +894,21 @@
>   case Instruction::AShr:
>     DEBUG(dbgs() << "Cloning IVUser: " << *DU.NarrowUse << "\n");
> 
> -    IRBuilder<> Builder(DU.NarrowUse);
> -
>     // Replace NarrowDef operands with WideDef. Otherwise, we don't know
>     // anything about the narrow operand yet so must insert a [sz]ext. It is
>     // probably loop invariant and will be folded or hoisted. If it actually
>     // comes from a widened IV, it should be removed during a future call to
>     // WidenIVUse.
>     Value *LHS = (DU.NarrowUse->getOperand(0) == DU.NarrowDef) ? DU.WideDef :
> -      getExtend(DU.NarrowUse->getOperand(0), WideType, IsSigned, Builder);
> +      getExtend(DU.NarrowUse->getOperand(0), WideType, IsSigned, DU.NarrowUse);
>     Value *RHS = (DU.NarrowUse->getOperand(1) == DU.NarrowDef) ? DU.WideDef :
> -      getExtend(DU.NarrowUse->getOperand(1), WideType, IsSigned, Builder);
> +      getExtend(DU.NarrowUse->getOperand(1), WideType, IsSigned, DU.NarrowUse);
> 
>     BinaryOperator *NarrowBO = cast<BinaryOperator>(DU.NarrowUse);
>     BinaryOperator *WideBO = BinaryOperator::Create(NarrowBO->getOpcode(),
>                                                     LHS, RHS,
>                                                     NarrowBO->getName());
> +    IRBuilder<> Builder(DU.NarrowUse);
>     Builder.Insert(WideBO);
>     if (const OverflowingBinaryOperator *OBO =
>         dyn_cast<OverflowingBinaryOperator>(NarrowBO)) {
> @@ -1391,17 +1412,6 @@
>   return Ty;
> }
> 
> -/// isLoopInvariant - Perform a quick domtree based check for loop invariance
> -/// assuming that V is used within the loop. LoopInfo::isLoopInvariant() seems
> -/// gratuitous for this purpose.
> -static bool isLoopInvariant(Value *V, Loop *L, DominatorTree *DT) {
> -  Instruction *Inst = dyn_cast<Instruction>(V);
> -  if (!Inst)
> -    return true;
> -
> -  return DT->properlyDominates(Inst->getParent(), L->getHeader());
> -}
> -
> /// getLoopPhiForCounter - Return the loop header phi IFF IncV adds a loop
> /// invariant value to the phi.
> static PHINode *getLoopPhiForCounter(Value *IncV, Loop *L, DominatorTree *DT) {
> 
> 
> _______________________________________________
> 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