[llvm-dev] Question about Unrolling Loop with Multiple Exits

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Fri Jul 16 10:26:32 PDT 2021


On 7/16/21 9:29 AM, Jingu Kang wrote:
>
> Hi Philip,
>
> Thanks for your kind reply.
>
> > A) Are you measuring on tip of tree?� There were changes for 
> multiple exit unrolling which landed very recently.
>
> Yep, I am investigating benchmarks with llvm tip and I can see the 
> llvm fails to unroll some loops with multiple exits.
>
> > B) One of your exits does not dominate your latch.� Those are 
> generally hard
>
> > C) This example does not seem to require gotos.� I strongly 
> suggest reducing your test cases if you want more informed commentary.�
>
> I am looking at perlbench recently and it has `goto` statements inside 
> loop. The example is a reduced case.
>
Right, but the gotos aren't relevant for your reduced test.  You can 
reduce further.
>
> When I look at the gcc’s output of the example, it looks like gcc 
> unrolls only the below `if` statement block…
>
>     if (*s++ != '\n')
>
>       continue;
>
Your phrasing here does not parse for me.  Can you restate this with 
different wording and maybe a fully worked example?
>
> Thanks
>
> JinGu Kang
>
> *From:* llvm-dev <llvm-dev-bounces at lists.llvm.org> *On Behalf Of 
> *Philip Reames via llvm-dev
> *Sent:* 16 July 2021 15:52
> *To:* Jingu Kang <Jingu.Kang at arm.com>; llvm-dev at lists.llvm.org
> *Subject:* Re: [llvm-dev] Question about Unrolling Loop with Multiple 
> Exits
>
> A) Are you measuring on tip of tree?� There were changes for 
> multiple exit unrolling which landed very recently.
>
> B) One of your exits does not dominate your latch.� Those are 
> generally hard.�
>
> C) This example does not seem to require gotos.� I strongly suggest 
> reducing your test cases if you want more informed commentary.�
>
> Philip
>
> On 7/16/21 7:42 AM, Jingu Kang via llvm-dev wrote:
>
>     Hi All,
>
>     �
>
>     While I am investigating benchmarks, I have found loops which llvm
>     fails to unroll because the loops have multiple exits.
>
>     For example,
>
>     �
>
>     char *foo(void);
>
>     int boo(char *s);
>
>     �
>
>     int test(char *s, char *end, char *check1, char *check2) {
>
>     � while (s <= end) {
>
>     ��� if (*s++ != '\n')
>
>     ����� continue;
>
>     ��� if (check1 || check2) {
>
>     ����� s = foo();
>
>     ����� if (!s)
>
>     ������� goto ret1;
>
>     ��� }��
>
>     ����if (boo(s))
>
>     ����� goto ret0;
>
>     � }
>
>     � goto ret1;
>
>     �
>
>     ret0:
>
>     � return 0;
>
>     ret1:
>
>     � return 1;
>
>     }
>
>     �
>
>     Above code causes below messages from LoopUnroll pass.
>
>     �
>
>     Bailout for multi-exit handling when latch exit has >1 predecessor.
>
>     Multiple exit/exiting blocks in loop and multi-exit unrolling not
>     enabled!
>
>     �
>
>     I can see the option `unroll-runtime-multi-exit` and comments
>     about it. I wonder there are already reviews for the work on
>     phabriactor or some people are working on it.
>
>     If someone knows information about it, please share it.
>
>     �
>
>     Thanks
>
>     JinGu Kang
>
>     �
>
>     �
>
>     �
>
>     �
>
>     �
>
>     �
>
>
>
>     _______________________________________________
>
>     LLVM Developers mailing list
>
>     llvm-dev at lists.llvm.org  <mailto:llvm-dev at lists.llvm.org>
>
>     https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev  <https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210716/ef2cd4c8/attachment.html>


More information about the llvm-dev mailing list