public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: "Andre Vieira (lists)" <andre.simoesdiasvieira@arm.com>
To: Richard Biener <rguenther@suse.de>
Cc: Richard Sandiford <richard.sandiford@arm.com>,
	"gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Subject: Re: [RFC] Using main loop's updated IV as base_address for epilogue vectorization
Date: Wed, 16 Jun 2021 11:24:24 +0100	[thread overview]
Message-ID: <077c4a2f-d745-dd0a-4d6d-d73d6a558529@arm.com> (raw)
In-Reply-To: <nycvar.YFH.7.76.2106141253390.9200@zhemvz.fhfr.qr>


On 14/06/2021 11:57, Richard Biener wrote:
> On Mon, 14 Jun 2021, Richard Biener wrote:
>
>> Indeed. For example a simple
>> int a[1024], b[1024], c[1024];
>>
>> void foo(int n)
>> {
>>    for (int i = 0; i < n; ++i)
>>      a[i+1] += c[i+i] ? b[i+1] : 0;
>> }
>>
>> should usually see peeling for alignment (though on x86 you need
>> exotic -march= since cost models generally have equal aligned and
>> unaligned access costs).  For example with -mavx2 -mtune=atom
>> we'll see an alignment peeling prologue, a AVX2 vector loop,
>> a SSE2 vectorized epilogue and a scalar epilogue.  It also
>> shows the original scalar loop being used in the scalar prologue
>> and epilogue.
>>
>> We're not even trying to make the counting IV easily used
>> across loops (we're not counting scalar iterations in the
>> vector loops).
> Specifically we see
>
> <bb 33> [local count: 94607391]:
> niters_vector_mult_vf.10_62 = bnd.9_61 << 3;
> _67 = niters_vector_mult_vf.10_62 + 7;
> _64 = (int) niters_vector_mult_vf.10_62;
> tmp.11_63 = i_43 + _64;
> if (niters.8_45 == niters_vector_mult_vf.10_62)
>    goto <bb 37>; [12.50%]
> else
>    goto <bb 36>; [87.50%]
>
> after the maini vect loop, recomputing the original IV (i) rather
> than using the inserted canonical IV.  And then the vectorized
> epilogue header check doing
>
> <bb 36> [local count: 93293400]:
> # i_59 = PHI <tmp.11_63(33), 0(18)>
> # _66 = PHI <_67(33), 0(18)>
> _96 = (unsigned int) n_10(D);
> niters.26_95 = _96 - _66;
> _108 = (unsigned int) n_10(D);
> _109 = _108 - _66;
> _110 = _109 + 4294967295;
> if (_110 <= 3)
>    goto <bb 47>; [10.00%]
> else
>    goto <bb 40>; [90.00%]
>
> re-computing everything from scratch again (also notice how
> the main vect loop guard jumps around the alignment prologue
> as well and lands here - and the vectorized epilogue using
> unaligned accesses - good!).
>
> That is, I'd expect _much_ easier jobs if we'd manage to
> track the number of performed scalar iterations (or the
> number of scalar iterations remaining) using the canonical
> IV we add to all loops across all of the involved loops.
>
> Richard.


So I am now looking at using an IV that counts scalar iterations rather 
than vector iterations and reusing that through all loops, (prologue, 
main loop, vect_epilogue and scalar epilogue). The first is easy, since 
that's what we already do for partial vectors or non-constant VFs. The 
latter requires some plumbing and removing a lot of the code in there 
that creates new IV's going from [0, niters - previous iterations]. I 
don't yet have a clear cut view of how to do this, I first thought of 
keeping track of the 'control' IV in the loop_vinfo, but the prologue 
and scalar epilogues won't have one. 'loop' keeps a control_ivs struct, 
but that is used for overflow detection and only keeps track of what 
looks like a constant 'base' and 'step'. Not quite sure how all that 
works, but intuitively doesn't seem like the right thing to reuse.

I'll go hack around and keep you posted on progress.

Regards,
Andre


  reply	other threads:[~2021-06-16 10:24 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-30  9:07 Andre Vieira (lists)
2021-05-04  9:56 ` Richard Biener
2021-05-05 11:34   ` Andre Vieira (lists)
2021-05-05 12:34     ` Richard Biener
2021-05-05 16:58       ` Andre Vieira (lists)
2021-05-07 12:05         ` Richard Biener
2021-05-17  8:14         ` Andre Vieira (lists)
2021-05-20 10:22           ` Richard Biener
2021-06-14  8:10             ` Andre Vieira (lists)
2021-06-14  8:37               ` Richard Biener
2021-06-14 10:57                 ` Richard Biener
2021-06-16 10:24                   ` Andre Vieira (lists) [this message]
2021-06-16 11:13                     ` Richard Biener

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=077c4a2f-d745-dd0a-4d6d-d73d6a558529@arm.com \
    --to=andre.simoesdiasvieira@arm.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=rguenther@suse.de \
    --cc=richard.sandiford@arm.com \
    /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).