Question about alias check in ddg.c
Bingfeng Mei
bmei@broadcom.com
Wed Sep 15 15:20:00 GMT 2010
The old insns_may_alias_p is based checking alias set number. But since
4.5, the new alias oracle doesn't rely the alias set number. may_alias_p()
is a new function based on alias oracle. Essentially, it is same as
true_dependence function but excluding offset and TBAA based disambiguation,
which is not valid for cross-iteration memory dependence analysis.
Cheers,
Bingfeng
> -----Original Message-----
> From: gcc-owner@gcc.gnu.org [mailto:gcc-owner@gcc.gnu.org] On Behalf Of
> Revital1 Eres
> Sent: 15 September 2010 13:28
> To: gcc@gcc.gnu.org
> Subject: Question about alias check in ddg.c
>
>
> Hello,
>
> When trying to compile the following loop with GCC -r164298 with modulo
> scheduling pass enabled on PowerPC I get that the inter loop edges
> between the memory instructions are created in the DDG although the
> following check in ddg.c exists:
>
> static void
> add_inter_loop_mem_dep (ddg_ptr g, ddg_node_ptr from, ddg_node_ptr to)
> {
> if (!insns_may_alias_p (from->insn, to->insn))
> return;
>
> With GCC -r146278 the edges are not created in the DDG.
> Looking more closely into the code I see the following differences in
> ddg.c
> between the GCC versions:
>
> The new version of GCC contains:
>
> add_inter_loop_mem_dep () -> ...-> may_alias_p()
>
> while with GCC -r146278:
>
> add_inter_loop_mem_dep () -> ... -> insn_alias_sets_conflict_p()
>
> I do not understand this behavior and I appreciate an explanation.
>
> Thanks,
> Revital
>
>
> void foo( int * __restrict__ dst, int * __restrict__ src1,
> int * __restrict__ src2)
> {
> int x, y;
>
> for( x = 0; x < 100; x+=1 )
> {
> dst[x] = ( src1[x] * src2[x] ) ;
> }
> }
>
More information about the Gcc
mailing list