public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jean Christophe Beyler <jean.christophe.beyler@gmail.com>
To: Bingfeng Mei <bmei@broadcom.com>
Cc: Zdenek Dvorak <rakdver@kam.mff.cuni.cz>,
	"gcc@gcc.gnu.org" <gcc@gcc.gnu.org>
Subject: Re: Turning off unrolling to certain loops
Date: Fri, 16 Oct 2009 13:51:00 -0000	[thread overview]
Message-ID: <c568a2600910160642x7d704a93w3807881612c5b3d3@mail.gmail.com> (raw)
In-Reply-To: <7FB04A5C213E9943A72EE127DB74F0AD93CCBE4C2F@SJEXCHCCR02.corp.ad.broadcom.com>

Wow, it seems more complicated then me.

I think I will modify my approach to :

- Add a node PRAGMA in the tree level when parsing the loop

- As soon as the loop structures are in place, find the pragma, update
the loop structure, remove the node

- Before the loop structure is lost due to the transformation to RTL,
create a note in the loop

- As soon as the loop structures are valid again in RTL, find the
notes and update the loop structures again, remove the notes


For the moment, though I don't remove the nodes like I just said, I
see no problems with this solutions, I've tried on multiple examples,
single loops or nested loops, and it seems to be working fine.

I will continue the testing, at worse, I'll change the notes to an
RTL, my question is, how do you force it to not be taken out of the
loop and how do you ensure it does not affect later pass optimizations
? I suppose you can remove them once you register their presence.

Jc

On Fri, Oct 16, 2009 at 5:09 AM, Bingfeng Mei <bmei@broadcom.com> wrote:
> The basic idea is the same as what is described in this thread.
>  http://gcc.gnu.org/ml/gcc/2008-05/msg00436.html
> But I made many changes on Alex's method.
>
> Pragmas are encoded into names of the helper functions because
> they are not optimized out by tree-level optimizer. These
> pseudo functions are either be consumed by target-builtins.c
> if it is only used at tree-level (unroll) or be replaced in
> target-builtins.c with special rtl NOTE(ivdep).
>
> To ensure the right scope of these loop pragmas, I also modified
> c_parser_for_statement, c_parser_while_statemennt, etc, to check
> loop level. I define that these pragmas only control the next
> innnermost loop. Once the right scope of the pragma is determined,
> I actually generate two helper functions for each pragma. The second
> is to close the scope of the pragma.
>
> When the pragma is used, I just search backward for preceding
> helper function (tree-level) or special note (rtl-level)
>
>
> Bingfeng
>
>> -----Original Message-----
>> From: fearyourself@gmail.com [mailto:fearyourself@gmail.com]
>> On Behalf Of Jean Christophe Beyler
>> Sent: 15 October 2009 17:27
>> To: Bingfeng Mei
>> Cc: Zdenek Dvorak; gcc@gcc.gnu.org
>> Subject: Re: Turning off unrolling to certain loops
>>
>> I implemented it like this:
>>
>> - I modified c_parser_for_statement to include a pragma tree node in
>> the loop with the unrolling request as an argument
>>
>> - Then during my pass to handle unrolling, I parse the loop
>> to find the pragma.
>>          - I retrieve the unrolling factor and use a merge of Zdenek's
>> code and yours to perform either a perfect unrolling or  and register
>> it in the loop structure
>>
>>           - During the following passes that handle loop unrolling, I
>> look at that variable in the loop structure to see if yes or no, we
>> should allow the normal execution of the unrolling
>>
>>           - During the expand, I transform the pragma into a note that
>> will allow me to remove any unrolling at that point.
>>
>> That is what I did and it seems to work quite well.
>>
>> Of course, I have a few things I am currently considering:
>>     - Is there really a position that is better for the pragma node in
>> the tree representation ?
>>     - Can other passes actually move that node out of a given loop
>> before I register it in the loop ?
>>     - Should I, instead of keeping that node through the tree
>> optimizations, actually remove it and later on add it just before
>> expansion ?
>>     - Can an RTL pass remove notes or move them out of a loop ?
>>     - Can the tree node or note change whether or not an optimization
>> takes place?
>>     - It is important to note that after the registration, the pragma
>> node or note are actually just there to say "don't do anything",
>> therefore, the number of nodes or notes in the loop is not important
>> as long as they are not moved out.
>>
>> Those are my current concerns :-), I can give more
>> information if requested,
>> Jc
>>
>> PS: What exactly was your solution to this issue?
>>
>>
>> On Thu, Oct 15, 2009 at 12:11 PM, Bingfeng Mei
>> <bmei@broadcom.com> wrote:
>> > Jc,
>> > How did you implement #pragma unroll?  I checked other
>> compilers. The
>> > pragma should govern the next immediate loop. It took me a while to
>> > find a not-so-elegant way to do that. I also implemented
>> #pragma ivdep.
>> > These information are supposed to be passed through both
>> tree and RTL
>> > levels and suvive all GCC optimization. I still have
>> problem in handling
>> > combination of unroll and ivdep.
>> >
>> > Bingfeng
>> >
>> >> -----Original Message-----
>> >> From: fearyourself@gmail.com [mailto:fearyourself@gmail.com]
>> >> On Behalf Of Jean Christophe Beyler
>> >> Sent: 15 October 2009 16:34
>> >> To: Zdenek Dvorak
>> >> Cc: Bingfeng Mei; gcc@gcc.gnu.org
>> >> Subject: Re: Turning off unrolling to certain loops
>> >>
>> >> You are entirely correct, I hadn't thought that through enough.
>> >>
>> >> So I backtracked and have just merged what Bingfeng Mei
>> has done with
>> >> your code and have now a corrected version of the loop unrolling.
>> >>
>> >> What I did was directly modified tree_unroll_loop to
>> handle the case
>> >> of a perfect unroll or not internally and then used
>> something similar
>> >> to what you had done around that. I added what I think is needed to
>> >> stop unrolling of those loops in later passes.
>> >>
>> >> I'll be starting my tests but I can port it to 4.5 if you are
>> >> interested to see what I did.
>> >> Jc
>> >>
>> >> On Thu, Oct 15, 2009 at 6:00 AM, Zdenek Dvorak
>> >> <rakdver@kam.mff.cuni.cz> wrote:
>> >> > Hi,
>> >> >
>> >> >> I faced a similar issue a while ago. I filed a bug report
>> >> >> (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36712) In the end,
>> >> >> I implemented a simple tree-level unrolling pass in our port
>> >> >> which uses all the existing infrastructure. It works
>> quite well for
>> >> >> our purpose, but I hesitated to submit the patch because
>> >> it contains
>> >> >> our not-very-elegannt #prgama unroll implementation.
>> >> >
>> >> > could you please do so anyway?  Even if there are some
>> >> issues with the
>> >> > #prgama unroll implementation, it could serve as a basis
>> of a usable
>> >> > patch.
>> >> >
>> >> >> /* Perfect unrolling of a loop */
>> >> >> static void tree_unroll_perfect_loop (struct loop *loop,
>> >> unsigned factor,
>> >> >>                 edge exit)
>> >> >> {
>> >> >> ...
>> >> >> }
>> >> >>
>> >> >>
>> >> >>
>> >> >> /* Go through all the loops:
>> >> >>      1. Determine unrolling factor
>> >> >>      2. Unroll loops in different conditions
>> >> >>         -- perfect loop: no extra copy of original loop
>> >> >>         -- other loops: the original version of loops to
>> >> execute the remaining iterations
>> >> >> */
>> >> >> static unsigned int rest_of_tree_unroll (void)
>> >> >> {
>> >> > ...
>> >> >>        tree niters = number_of_exit_cond_executions(loop);
>> >> >>
>> >> >>        bool perfect_unrolling = false;
>> >> >>        if(niters != NULL_TREE && niters!= chrec_dont_know
>> >> && TREE_CODE(niters) == INTEGER_CST){
>> >> >>          int num_iters = tree_low_cst(niters, 1);
>> >> >>          if((num_iters % unroll_factor) == 0)
>> >> >>            perfect_unrolling = true;
>> >> >>        }
>> >> >>
>> >> >>        /* If no. of iterations can be divided by unrolling
>> >> factor, we have perfect unrolling */
>> >> >>        if(perfect_unrolling){
>> >> >>          tree_unroll_perfect_loop(loop, unroll_factor,
>> >> single_dom_exit(loop));
>> >> >>        }
>> >> >>        else{
>> >> >>          tree_unroll_loop (loop, unroll_factor,
>> >> single_dom_exit (loop), &desc);
>> >> >>        }
>> >> >
>> >> > It would be better to move this test to tree_unroll_loop, and not
>> >> > duplicate its code in tree_unroll_perfect_loop.
>> >> >
>> >> > Zdenek
>> >> >
>> >>
>> >>
>> >
>>
>>
>

      reply	other threads:[~2009-10-16 13:43 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-05 20:46 Jean Christophe Beyler
2009-10-06  6:54 ` Zdenek Dvorak
2009-10-06 13:34   ` Jean Christophe Beyler
     [not found]     ` <20091006135624.GA18714@kam.mff.cuni.cz>
     [not found]       ` <c568a2600910060756m96adf86mb1507c6717fdfdb6@mail.gmail.com>
     [not found]         ` <20091006150918.GA19277@kam.mff.cuni.cz>
     [not found]           ` <c568a2600910060828l24ec5ecct926eb2624a1d2157@mail.gmail.com>
2009-10-08 16:18             ` Jean Christophe Beyler
2009-10-08 16:23               ` Zdenek Dvorak
2009-10-08 18:52                 ` Jean Christophe Beyler
2009-10-14 18:56                   ` Jean Christophe Beyler
2009-10-15  0:45                     ` Zdenek Dvorak
2009-10-15 10:00                     ` Bingfeng Mei
2009-10-15 14:41                       ` Zdenek Dvorak
2009-10-15 15:56                         ` Jean Christophe Beyler
2009-10-15 16:27                           ` Bingfeng Mei
2009-10-15 17:16                             ` Jean Christophe Beyler
2009-10-16 12:17                               ` Bingfeng Mei
2009-10-16 13:51                                 ` Jean Christophe Beyler [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c568a2600910160642x7d704a93w3807881612c5b3d3@mail.gmail.com \
    --to=jean.christophe.beyler@gmail.com \
    --cc=bmei@broadcom.com \
    --cc=gcc@gcc.gnu.org \
    --cc=rakdver@kam.mff.cuni.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).