[llvm] r278413 - [SCEV] Update interface to handle SCEVExpander insert point motion.

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 11 14:52:01 PDT 2016


Merged to 3.9 in r278424.

On Thu, Aug 11, 2016 at 2:05 PM, Geoff Berry via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: gberry
> Date: Thu Aug 11 16:05:17 2016
> New Revision: 278413
>
> URL: http://llvm.org/viewvc/llvm-project?rev=278413&view=rev
> Log:
> [SCEV] Update interface to handle SCEVExpander insert point motion.
>
> Summary:
> This is an extension of the fix in r271424.  That fix dealt with builder
> insert points being moved by SCEV expansion, but only for the lifetime
> of the expand call.  This change modifies the interface so that LSR can
> safely call expand multiple times at the same insert point and do the
> right thing if one of the expansions decides to move the original insert
> point.
>
> This is a fix for PR28719.
>
> Reviewers: sanjoy
>
> Subscribers: llvm-commits, mcrosier, mzolotukhin
>
> Differential Revision: https://reviews.llvm.org/D23342
>
> Added:
>     llvm/trunk/test/Transforms/LoopStrengthReduce/X86/pr28719.ll
> Modified:
>     llvm/trunk/include/llvm/Analysis/ScalarEvolutionExpander.h
>     llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp
>     llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
>
> Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolutionExpander.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolutionExpander.h?rev=278413&r1=278412&r2=278413&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/ScalarEvolutionExpander.h (original)
> +++ llvm/trunk/include/llvm/Analysis/ScalarEvolutionExpander.h Thu Aug 11 16:05:17 2016
> @@ -197,6 +197,13 @@ namespace llvm {
>      /// block.
>      Value *expandCodeFor(const SCEV *SH, Type *Ty, Instruction *I);
>
> +    /// \brief Insert code to directly compute the specified SCEV expression
> +    /// into the program.  The inserted code is inserted into the SCEVExpander's
> +    /// current insertion point. If a type is specified, the result will be
> +    /// expanded to have that type, with a cast if necessary.
> +    Value *expandCodeFor(const SCEV *SH, Type *Ty = nullptr);
> +
> +
>      /// \brief Generates a code sequence that evaluates this predicate.
>      /// The inserted instructions will be at position \p Loc.
>      /// The result will be of type i1 and will have a value of 0 when the
> @@ -254,6 +261,15 @@ namespace llvm {
>
>      void enableLSRMode() { LSRMode = true; }
>
> +    /// \brief Set the current insertion point. This is useful if multiple calls
> +    /// to expandCodeFor() are going to be made with the same insert point and
> +    /// the insert point may be moved during one of the expansions (e.g. if the
> +    /// insert point is not a block terminator).
> +    void setInsertPoint(Instruction *IP) {
> +      assert(IP);
> +      Builder.SetInsertPoint(IP);
> +    }
> +
>      /// \brief Clear the current insertion point. This is useful if the
>      /// instruction that had been serving as the insertion point may have been
>      /// deleted.
> @@ -325,12 +341,6 @@ namespace llvm {
>
>      Value *expand(const SCEV *S);
>
> -    /// \brief Insert code to directly compute the specified SCEV expression
> -    /// into the program.  The inserted code is inserted into the SCEVExpander's
> -    /// current insertion point. If a type is specified, the result will be
> -    /// expanded to have that type, with a cast if necessary.
> -    Value *expandCodeFor(const SCEV *SH, Type *Ty = nullptr);
> -
>      /// \brief Determine the most "relevant" loop for the given SCEV.
>      const Loop *getRelevantLoop(const SCEV *);
>
>
> Modified: llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp?rev=278413&r1=278412&r2=278413&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp (original)
> +++ llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp Thu Aug 11 16:05:17 2016
> @@ -1610,8 +1610,7 @@ Value *SCEVExpander::visitUMaxExpr(const
>
>  Value *SCEVExpander::expandCodeFor(const SCEV *SH, Type *Ty,
>                                     Instruction *IP) {
> -  assert(IP);
> -  Builder.SetInsertPoint(IP);
> +  setInsertPoint(IP);
>    return expandCodeFor(SH, Ty);
>  }
>
>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=278413&r1=278412&r2=278413&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Thu Aug 11 16:05:17 2016
> @@ -4444,6 +4444,7 @@ Value *LSRInstance::Expand(const LSRFixu
>    // Determine an input position which will be dominated by the operands and
>    // which will dominate the result.
>    IP = AdjustInsertPositionForExpand(IP, LF, LU, Rewriter);
> +  Rewriter.setInsertPoint(&*IP);
>
>    // Inform the Rewriter if we have a post-increment use, so that it can
>    // perform an advantageous expansion.
> @@ -4475,7 +4476,7 @@ Value *LSRInstance::Expand(const LSRFixu
>                                   LF.UserInst, LF.OperandValToReplace,
>                                   Loops, SE, DT);
>
> -    Ops.push_back(SE.getUnknown(Rewriter.expandCodeFor(Reg, nullptr, &*IP)));
> +    Ops.push_back(SE.getUnknown(Rewriter.expandCodeFor(Reg, nullptr)));
>    }
>
>    // Expand the ScaledReg portion.
> @@ -4493,14 +4494,14 @@ Value *LSRInstance::Expand(const LSRFixu
>        // Expand ScaleReg as if it was part of the base regs.
>        if (F.Scale == 1)
>          Ops.push_back(
> -            SE.getUnknown(Rewriter.expandCodeFor(ScaledS, nullptr, &*IP)));
> +            SE.getUnknown(Rewriter.expandCodeFor(ScaledS, nullptr)));
>        else {
>          // An interesting way of "folding" with an icmp is to use a negated
>          // scale, which we'll implement by inserting it into the other operand
>          // of the icmp.
>          assert(F.Scale == -1 &&
>                 "The only scale supported by ICmpZero uses is -1!");
> -        ICmpScaledV = Rewriter.expandCodeFor(ScaledS, nullptr, &*IP);
> +        ICmpScaledV = Rewriter.expandCodeFor(ScaledS, nullptr);
>        }
>      } else {
>        // Otherwise just expand the scaled register and an explicit scale,
> @@ -4510,11 +4511,11 @@ Value *LSRInstance::Expand(const LSRFixu
>        // Unless the addressing mode will not be folded.
>        if (!Ops.empty() && LU.Kind == LSRUse::Address &&
>            isAMCompletelyFolded(TTI, LU, F)) {
> -        Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty, &*IP);
> +        Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty);
>          Ops.clear();
>          Ops.push_back(SE.getUnknown(FullV));
>        }
> -      ScaledS = SE.getUnknown(Rewriter.expandCodeFor(ScaledS, nullptr, &*IP));
> +      ScaledS = SE.getUnknown(Rewriter.expandCodeFor(ScaledS, nullptr));
>        if (F.Scale != 1)
>          ScaledS =
>              SE.getMulExpr(ScaledS, SE.getConstant(ScaledS->getType(), F.Scale));
> @@ -4526,7 +4527,7 @@ Value *LSRInstance::Expand(const LSRFixu
>    if (F.BaseGV) {
>      // Flush the operand list to suppress SCEVExpander hoisting.
>      if (!Ops.empty()) {
> -      Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty, &*IP);
> +      Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty);
>        Ops.clear();
>        Ops.push_back(SE.getUnknown(FullV));
>      }
> @@ -4536,7 +4537,7 @@ Value *LSRInstance::Expand(const LSRFixu
>    // Flush the operand list to suppress SCEVExpander hoisting of both folded and
>    // unfolded offsets. LSR assumes they both live next to their uses.
>    if (!Ops.empty()) {
> -    Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty, &*IP);
> +    Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty);
>      Ops.clear();
>      Ops.push_back(SE.getUnknown(FullV));
>    }
> @@ -4572,7 +4573,7 @@ Value *LSRInstance::Expand(const LSRFixu
>    const SCEV *FullS = Ops.empty() ?
>                        SE.getConstant(IntTy, 0) :
>                        SE.getAddExpr(Ops);
> -  Value *FullV = Rewriter.expandCodeFor(FullS, Ty, &*IP);
> +  Value *FullV = Rewriter.expandCodeFor(FullS, Ty);
>
>    // We're done expanding now, so reset the rewriter.
>    Rewriter.clearPostInc();
>
> Added: llvm/trunk/test/Transforms/LoopStrengthReduce/X86/pr28719.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/X86/pr28719.ll?rev=278413&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopStrengthReduce/X86/pr28719.ll (added)
> +++ llvm/trunk/test/Transforms/LoopStrengthReduce/X86/pr28719.ll Thu Aug 11 16:05:17 2016
> @@ -0,0 +1,47 @@
> +; RUN: opt < %s -loop-reduce -S | FileCheck %s
> +
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> + at a = global i32 0, align 4
> + at b = global i8 0, align 1
> + at c = global [4 x i8] zeroinitializer, align 1
> +
> +; Just make sure we don't generate code with uses not dominated by defs.
> +; CHECK-LABEL: @main(
> +define i32 @main() {
> +entry:
> +  %a0 = load i32, i32* @a, align 4
> +  %cmpa = icmp slt i32 %a0, 4
> +  br i1 %cmpa, label %preheader, label %for.end
> +
> +preheader:
> +  %b0 = load i8, i8* @b, align 1
> +  %b0sext = sext i8 %b0 to i64
> +  br label %for.body
> +
> +for.body:
> +  %iv = phi i64 [ 0, %preheader ], [ %iv.next, %lor.false ]
> +  %mul = mul nsw i64 %b0sext, %iv
> +  %multrunc = trunc i64 %mul to i32
> +  %cmp = icmp eq i32 %multrunc, 0
> +  br i1 %cmp, label %lor.false, label %if.then
> +
> +lor.false:
> +  %cgep = getelementptr inbounds [4 x i8], [4 x i8]* @c, i64 0, i64 %iv
> +  %ci = load i8, i8* %cgep, align 1
> +  %cisext = sext i8 %ci to i32
> +  %ivtrunc = trunc i64 %iv to i32
> +  %cmp2 = icmp eq i32 %cisext, %ivtrunc
> +  %iv.next = add i64 %iv, 1
> +  br i1 %cmp2, label %for.body, label %if.then
> +
> +if.then:
> +  tail call void @abort()
> +  unreachable
> +
> +for.end:
> +  ret i32 0
> +}
> +
> +declare void @abort()
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list