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

Sanjoy Das via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 25 17:02:01 PDT 2015


>> 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?

The test was checking for a store to an unescaped alloca.  With the SCEV 
changes, LLVM is able to prove that the alloca is unescaped, and 
therefore can elide the store.

In more detail: the alloca was used in a recursive PHI node in a loop, 
as the "entry" value.  SCEV is now able to prove that the loop in 
question iterates exactly once, so the backedge disappears, and so does 
the recursive PHI.  This lets LLVM prove that the alloca is unescaped.

The fix to the test case went in in http://reviews.llvm.org/D13183

-- Sanjoy

>
>   -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
>>
>


More information about the llvm-commits mailing list