From: Richard Biener <rguenther@suse.de>
To: Bingfeng Mei <bmei@broadcom.com>,"gcc@gcc.gnu.org" <gcc@gcc.gnu.org>
Subject: RE: No TBAA before ptr_derefs_may_alias_p?
Date: Fri, 31 Jan 2014 21:32:00 -0000 [thread overview]
Message-ID: <783352a3-eb4d-467a-82bd-8cca90f74a30@email.android.com> (raw)
In-Reply-To: <B71DF1153024A14EABB94E39368E44A604269DAC@SJEXCHMB13.corp.ad.broadcom.com>
On January 31, 2014 6:01:36 PM GMT+01:00, Bingfeng Mei <bmei@broadcom.com> wrote:
>Unfortunately this patch doesn't work because the memory dependency is
>Anti in this
>case.
>
>Why TBAA cannot handle anti- & output- dependencies? I check GCC bug
>database, and
>found pr38503 & pr38964. I don't fully understand it, but seems to me
>is related
>in handling C++ new operator. But this example is pretty clear and has
>nothing to
>do with C++ and new statement. Isn't it too conservative to disable
>TBAA for anti-
>& output- dependency here?
Because the gcc memory model allows the dynamic type of a memory location to change by a store.
That in turn is the only sensible way of supporting c++ placement new.
Richard.
>
>Bingfeng
>
>-----Original Message-----
>From: Richard Biener [mailto:rguenther@suse.de]
>Sent: 31 January 2014 15:24
>To: Bingfeng Mei; gcc@gcc.gnu.org
>Subject: Re: No TBAA before ptr_derefs_may_alias_p?
>
>On 1/31/14 4:02 PM, Bingfeng Mei wrote:
>> Hi,
>> I got this simple example to vectorize. Somehow, GCC (4.8) generates
>loop version because
>> it cannot determine alias between acc[i] write and x[i].real read. It
>is pretty obvious to me that they are not aliased based on TBAA
>information.
>>
>> typedef struct
>> {
>> short real;
>> short imag;
>> } complex16_t;
>>
>> void
>> libvector_AccSquareNorm_ref (unsigned long long *acc,
>> const complex16_t *x, unsigned len)
>> {
>> for (unsigned i = 0; i < len; i++)
>> {
>> acc[i] +=
>> ((unsigned long long)((int)x[i].real * x[i].real)) +
>> ((unsigned long long)((int)x[i].imag * x[i].imag));
>> }
>> }
>>
>> Tracing into how the alias information is calculated, I found it hits
>the following code
>> by calling ptr_derefs_may_alias_p and return true.
>ptr_derefs_may_alias_p doesn't contain
>> TBAA disambiguation code. Should we add check before that?
>>
>> /* If we had an evolution in a MEM_REF BASE_OBJECT we do not know
>> the size of the base-object. So we cannot do any offset/overlap
>> based analysis but have to rely on points-to information only.
>*/
>> if (TREE_CODE (addr_a) == MEM_REF
>> && DR_UNCONSTRAINED_BASE (a))
>> {
>> if (TREE_CODE (addr_b) == MEM_REF
>> && DR_UNCONSTRAINED_BASE (b))
>> return ptr_derefs_may_alias_p (TREE_OPERAND (addr_a, 0),
>> TREE_OPERAND (addr_b, 0));
>> else
>> return ptr_derefs_may_alias_p (TREE_OPERAND (addr_a, 0),
>> build_fold_addr_expr (addr_b));
>> }
>> else if (TREE_CODE (addr_b) == MEM_REF
>> && DR_UNCONSTRAINED_BASE (b))
>> return ptr_derefs_may_alias_p (build_fold_addr_expr (addr_a),
>> TREE_OPERAND (addr_b, 0));
>>
>> /* Otherwise DR_BASE_OBJECT is an access that covers the whole
>object
>> that is being subsetted in the loop nest. */
>> if (DR_IS_WRITE (a) && DR_IS_WRITE (b))
>> return refs_output_dependent_p (addr_a, addr_b);
>> else if (DR_IS_READ (a) && DR_IS_WRITE (b))
>> return refs_anti_dependent_p (addr_a, addr_b);
>> return refs_may_alias_p (addr_a, addr_b);
>>
>> This issue can be reproduced on trunk x86-64 gcc.
>
>True, you can add a
>
> if (flag_strict_aliasing
> && DR_IS_WRITE (a) && DR_IS_READ (b)
> && !alias_sets_conflict_p (get_alias_set (DR_REF (a)), get_alias_set
>(DR_REF (b)))
> return false;
>
>before the ptr_derefs_may_alias_p calls. TBAA is only valid for
>true dependences.
>
>Richard.
>
>> Cheers,
>> Bingfeng Mei
>>
next prev parent reply other threads:[~2014-01-31 19:43 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-31 15:24 Bingfeng Mei
2014-01-31 15:27 ` Richard Biener
2014-01-31 17:01 ` Bingfeng Mei
2014-01-31 17:18 ` Bingfeng Mei
2014-01-31 21:32 ` Richard Biener [this message]
2014-02-03 9:51 ` Bingfeng Mei
2014-02-03 9:59 ` Jakub Jelinek
2014-02-03 10:14 ` Florian Weimer
2014-02-03 10:19 ` Richard Biener
2014-02-03 11:49 ` Bingfeng Mei
2014-02-03 13:17 ` Richard Biener
2014-02-03 14:43 ` Bingfeng Mei
2014-02-03 14:45 ` Richard Biener
2014-02-03 10:15 ` Richard Biener
2014-02-03 10:36 ` Richard Biener
2014-02-03 11:58 ` Bingfeng Mei
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=783352a3-eb4d-467a-82bd-8cca90f74a30@email.android.com \
--to=rguenther@suse.de \
--cc=bmei@broadcom.com \
--cc=gcc@gcc.gnu.org \
/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).