> -----Original Message----- > From: Alexander Monakov [mailto:amona...@ispras.ru] > Sent: 02 August 2010 17:48 > To: Bingfeng Mei > Cc: gcc@gcc.gnu.org; Richard Guenther > Subject: Re: Restrict qualifier still not working? > > > > On Mon, 2 Aug 2010, Bingfeng Mei wrote: > > > Hi, > > I ran a small test to see how the trunk/4.5 works > > with the rewritten restrict qualified pointer code. But it doesn't > > seem to work on both x86-64 and our port. > > > > tst.c: > > void foo (int * restrict a, int * restrict b, > > int * restrict c, int * restrict d) > > { > > *c = *a + 1; > > *d = *b + 1; > > } > [snip] > > foo: > > .LFB0: > > .cfi_startproc > > movl (%rdi), %eax > > addl $1, %eax > > movl %eax, (%rdx) > > movl (%rsi), %eax > > addl $1, %eax > > movl %eax, (%rcx) > > ret > > > > In the finally generated code, the second load should have > > been moved before the first store if restrict qualifiers > > are handled correctly. > > > > Am I missing something here? Thanks. > > The second load is moved for me with -fschedule-insns, -frename- > registers or > -fselective-scheduling2 (all of which are disabled by default on x86-64 > -O2). > Without those flags, second scheduler alone cannot lift the load due to > dependency on %eax. > > Hope that helps.
Thanks, I can reproduce it with trunk compiler but not 4.5.0. Do you know how alias set are represented and used now. It used to be each alias set is assigned a unique number and there won't be a dependence edge drawn between different alias set. It seems not to be the case anymore. [2 *a_1(D)+0 S4 A32] The second field must play a role in disambiguate the memory access. BTW, why these two intermediate variables are both assigned to eax without these non-default options? This example has no register pressure. It looks like an issue with IRA. Cheers, Bingfeng