[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