[llvm] r248638 - [SCEV] Reapply 'Teach isLoopBackedgeGuardedByCond to exploit trip counts'

Hal Finkel via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 25 16:58:39 PDT 2015


----- Original Message -----
> From: "Sanjoy Das via llvm-commits" <llvm-commits at lists.llvm.org>
> To: llvm-commits at lists.llvm.org
> Sent: Friday, September 25, 2015 6:53:50 PM
> Subject: [llvm] r248638 - [SCEV] Reapply 'Teach isLoopBackedgeGuardedByCond to exploit trip counts'
> 
> Author: sanjoy
> Date: Fri Sep 25 18:53:50 2015
> New Revision: 248638
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=248638&view=rev
> Log:
> [SCEV] Reapply 'Teach isLoopBackedgeGuardedByCond to exploit trip
> counts'
> 
> Summary:
> If the trip count of a specific backedge is `N`, then we know that
> backedge is effectively guarded by the condition `{0,+,1} u< N`.
>  This
> change teaches SCEV to use this condition to prove things in
> `isLoopBackedgeGuardedByCond`.
> 
> Depends on D12948
> Depends on D12949
> 
> The original checkin, r248608 had to be backed out due to an issue
> with
> a ObjCXX unit test.  That issue is now fixed, so re-landing.

What was the issue?

 -Hal

> 
> Reviewers: atrick, reames, majnemer, hfinkel
> 
> Subscribers: llvm-commits
> 
> Differential Revision: http://reviews.llvm.org/D12950
> 
> Modified:
>     llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>     llvm/trunk/test/Analysis/ScalarEvolution/zext-wrap.ll
>     llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll
> 
> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=248638&r1=248637&r2=248638&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Fri Sep 25 18:53:50
> 2015
> @@ -6994,6 +6994,22 @@ ScalarEvolution::isLoopBackedgeGuardedBy
>  
>    SaveAndRestore<bool> ClearOnExit(WalkingBEDominatingConds, true);
>  
> +  // See if we can exploit a trip count to prove the predicate.
> +  const auto &BETakenInfo = getBackedgeTakenInfo(L);
> +  const SCEV *LatchBECount = BETakenInfo.getExact(Latch, this);
> +  if (LatchBECount != getCouldNotCompute()) {
> +    // We know that Latch branches back to the loop header exactly
> +    // LatchBECount times.  This means the backdege condition at
> Latch is
> +    // equivalent to  "{0,+,1} u< LatchBECount".
> +    Type *Ty = LatchBECount->getType();
> +    auto NoWrapFlags = SCEV::NoWrapFlags(SCEV::FlagNUW |
> SCEV::FlagNW);
> +    const SCEV *LoopCounter =
> +      getAddRecExpr(getZero(Ty), getOne(Ty), L, NoWrapFlags);
> +    if (isImpliedCond(Pred, LHS, RHS, ICmpInst::ICMP_ULT,
> LoopCounter,
> +                      LatchBECount))
> +      return true;
> +  }
> +
>    // Check conditions due to any @llvm.assume intrinsics.
>    for (auto &AssumeVH : AC.assumptions()) {
>      if (!AssumeVH)
> 
> Modified: llvm/trunk/test/Analysis/ScalarEvolution/zext-wrap.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/zext-wrap.ll?rev=248638&r1=248637&r2=248638&view=diff
> ==============================================================================
> --- llvm/trunk/test/Analysis/ScalarEvolution/zext-wrap.ll (original)
> +++ llvm/trunk/test/Analysis/ScalarEvolution/zext-wrap.ll Fri Sep 25
> 18:53:50 2015
> @@ -10,7 +10,7 @@ bb.i:           ; preds = %bb1.i, %bb.np
>  
>  ; This cast shouldn't be folded into the addrec.
>  ; CHECK: %tmp = zext i8 %l_95.0.i1 to i16
> -; CHECK: -->  (zext i8 {0,+,-1}<%bb.i> to i16){{ U: [^ ]+ S: [^
> ]+}}{{ *}}Exits: 2
> +; CHECK: -->  (zext i8 {0,+,-1}<nw><%bb.i> to i16){{ U: [^ ]+ S: [^
> ]+}}{{ *}}Exits: 2
>  
>          %tmp = zext i8 %l_95.0.i1 to i16
>  
> 
> Modified:
> llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll?rev=248638&r1=248637&r2=248638&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll
> (original)
> +++ llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll
> Fri Sep 25 18:53:50 2015
> @@ -356,5 +356,42 @@ define void @func_17(i32* %len.ptr) {
>    ret void
>  }
>  
> -!0 = !{i32 0, i32 2147483647}
> +define i1 @func_18(i16* %tmp20, i32* %len.addr) {
> +; CHECK-LABEL: @func_18(
> +entry:
> +  %len = load i32, i32* %len.addr, !range !0
> +  %tmp18 = icmp eq i32 %len, 0
> +  br i1 %tmp18, label %bb2, label %bb0.preheader
> +
> +bb0.preheader:
> +  br label %bb0
> +
> +bb0:
> +; CHECK: bb0:
> +  %var_0.in = phi i32 [ %var_0, %bb1 ], [ %len, %bb0.preheader ]
> +  %var_1 = phi i32 [ %tmp30, %bb1 ], [ 0, %bb0.preheader ]
> +  %var_0 = add nsw i32 %var_0.in, -1
> +  %tmp23 = icmp ult i32 %var_1, %len
> +; CHECK: br i1 true, label %stay, label %bb2.loopexit
> +  br i1 %tmp23, label %stay, label %bb2
> +
> +stay:
> +; CHECK: stay:
> +  %tmp25 = getelementptr inbounds i16, i16* %tmp20, i32 %var_1
> +  %tmp26 = load i16, i16* %tmp25
> +  %tmp29 = icmp eq i16 %tmp26, 0
> +  br i1 %tmp29, label %bb1, label %bb2
> +
> +bb1:
> +  %tmp30 = add i32 %var_1, 1
> +  %tmp31 = icmp eq i32 %var_0, 0
> +  br i1 %tmp31, label %bb3, label %bb0
>  
> +bb2:
> +  ret i1 false
> +
> +bb3:
> +  ret i1 true
> +}
> +
> +!0 = !{i32 0, i32 2147483647}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory


More information about the llvm-commits mailing list