[llvm-dev] SCEV related question
Sanjoy Das via llvm-dev
llvm-dev at lists.llvm.org
Mon Sep 2 09:29:58 PDT 2019
With the first example I see:
Determining loop execution counts for: @topup
Loop %for.body: backedge-taken count is (15 + (-1 * %i))
Loop %for.body: max backedge-taken count is -1
Loop %for.body: Predicated backedge-taken count is (15 + (-1 * %i))
So is the real problem here isn't that SCEV isn't computing the
correct BE count, but that the max BE count it computes is not
precise?
If yes, I think you'll have to change
https://github.com/llvm-project/llvm/blob/16bef0f9a051afa7b57f5fd01624086c35ec1e60/lib/Analysis/ScalarEvolution.cpp#L8746
to produce a more precise max trip count.
-- Sanjoy
On Sun, Aug 25, 2019 at 9:02 PM vivek pandya <vivekvpandya at gmail.com> wrote:
>
> Here is original C code:
> void topup(int a[], unsigned long i) {
> for (; i < 16; i++) {
> a[i] = 1;
> }
> }
>
> Here is the IR before the pass where I expect SCEV to return trip-count value
>
> ; Function Attrs: nofree norecurse nounwind uwtable writeonly
> define dso_local void @topup(i32* nocapture %a, i64 %i) local_unnamed_addr #0 {
> entry:
> %cmp3 = icmp ult i64 %i, 16
> br i1 %cmp3, label %for.body.preheader, label %for.end
>
> for.body.preheader: ; preds = %entry
> br label %for.body
>
> for.body: ; preds = %for.body.preheader, %for.body
> %i.addr.04 = phi i64 [ %inc, %for.body ], [ %i, %for.body.preheader ]
> %arrayidx = getelementptr inbounds i32, i32* %a, i64 %i.addr.04
> store i32 1, i32* %arrayidx, align 4, !tbaa !2
> %inc = add nuw nsw i64 %i.addr.04, 1
> %exitcond = icmp eq i64 %inc, 16
> br i1 %exitcond, label %for.end.loopexit, label %for.body
>
> for.end.loopexit: ; preds = %for.body
> br label %for.end
>
> for.end: ; preds = %for.end.loopexit, %entry
> ret void
> }
>
> I have also checked that at a pass before above pass SCEV works and returns 16.
>
> Here is the IR before a pass where SCEV works as per the expectations:
> ; Preheader:
> for.body.preheader: ; preds = %entry
> br label %for.body
>
> ; Loop:
> for.body: ; preds = %for.body.preheader, %for.body
> %i.addr.04 = phi i64 [ %inc, %for.body ], [ %i, %for.body.preheader ]
> %arrayidx = getelementptr inbounds i32, i32* %a, i64 %i.addr.04
> store i32 1, i32* %arrayidx, align 4, !tbaa !2
> %inc = add nuw nsw i64 %i.addr.04, 1
> %cmp = icmp ult i64 %inc, 16
> br i1 %cmp, label %for.body, label %for.end.loopexit
>
> ; Exit blocks
> for.end.loopexit: ; preds = %for.body
> br label %for.end
>
> - Vivek
>
> On Mon, Aug 26, 2019 at 2:09 AM Sanjoy Das <sanjoy at playingwithpointers.com> wrote:
>>
>> On Sun, Aug 25, 2019 at 4:49 AM vivek pandya via llvm-dev
>> <llvm-dev at lists.llvm.org> wrote:
>> >
>> > Hello,
>> >
>> > I am first time paying with SCEV codebase.
>> > I am trying to find out why ScalarEvolution is not able to give correct back edge taken count for an expression.
>> >
>> > So in my case flow reaches to howFarToZero() and in that function, I have following expressions as SCEV
>> >
>> > Start = (15 + (-1 * %i) (which is set to Distance SCEV)
>> > Step = 1
>> >
>> > now, first of all, should I expect Start as ConstantSCEV (15) instead of the whole expression
>> > the problem here is getUnsignedRangeMax(Distance) returns very large number because of -1 in the SCEV.
>>
>> Given you have have above, in howFarToZero SCEV is reasoning about the
>> loop as if it were:
>>
>> unsigned i = ...;
>> unsigned Start = 15 - i;
>> while (Start != 0) {
>> unsigned Step = 1;
>> Start = Start + Step;
>> }
>>
>> > How we can make this work? Here we can clearly say that after 15 steps this expression will be 0
>>
>> and so I don't think this assertion ("after 15 steps this expression
>> will be 0") is correct.
>>
>> If you post a minimal example we can try to figure out if SCEV can be
>> smarter here.
>>
>> -- Sanjoy
>>
>> > and thus we have a value for backedge taken count.
>> >
>> > Any help will be appriciated.
>> >
>> > Thanks,
>> > Vivek
>> > _______________________________________________
>> > LLVM Developers mailing list
>> > llvm-dev at lists.llvm.org
>> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list