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