One more question...

Can " i = i.6_18;" be sinked out of loop, because it doesn't have memory
dependence with others?

Thanks,
-Jiangning

> -----Original Message-----
> From: gcc-ow...@gcc.gnu.org [mailto:gcc-ow...@gcc.gnu.org] On Behalf Of
> Jiangning Liu
> Sent: Thursday, November 24, 2011 2:57 PM
> To: gcc@gcc.gnu.org
> Subject: RE: A case exposing code sink issue
> 
> Sorry, I realize we can't do that optimization because a_p may have
> dependence upon other memory accesses like MEM[(int *)&a][D.2248_7].
> 
> For example, if it happens a_p equals &a_p, that optimization would be
> wrong.
> 
> But can alias analysis solve the problem if we can guarantee (i+(1<<k))
> is
> less than the upbound of array a's definition?
> 
> Or is there any GCC command line switch assuming no array bound
> overflow?
> That way we can do more aggressive optimizations, right?
> 
> Thanks,
> -Jiangning
> 
> > -----Original Message-----
> > From: gcc-ow...@gcc.gnu.org [mailto:gcc-ow...@gcc.gnu.org] On Behalf
> Of
> > Jiangning Liu
> > Sent: Thursday, November 24, 2011 12:05 PM
> > To: gcc@gcc.gnu.org
> > Subject: A case exposing code sink issue
> >
> > Hi,
> >
> > For this small test case,
> >
> > int a[512] ;
> > int b[512] ;
> > int *a_p ;
> > int *b_p ;
> > int i ;
> > int k ;
> >
> > int f(void)
> > {
> >         for( k = 1 ; k <= 9 ; k++)
> >         {
> >                 for( i = k ; i < 512 ; i += k)
> >                 {
> >                         a_p = &a[i + (1<<k)] ;
> >                         b_p = &b[i + (1<<k)] ;
> >                         *a_p = 7 ;
> >                         *b_p = 7 ;
> >                 }
> >         }
> > }
> >
> > Before sink pass we have,
> >
> > f ()
> > {
> >   int pretmp.11;
> >   int k.7;
> >   int i.6;
> >   int * b_p.3;
> >   int * a_p.2;
> >   int D.2248;
> >   int i.1;
> >   int D.2246;
> >   int k.0;
> >
> > <bb 2>:
> >   k = 1;
> >
> > <bb 3>:
> >   # k.0_9 = PHI <k.7_20(11), 1(2)>
> >   i = k.0_9;
> >   if (k.0_9 <= 511)
> >     goto <bb 7>;
> >   else
> >     goto <bb 8>;
> >
> > <bb 8>:
> > Invalid sum of incoming frequencies 900, should be 81
> >   goto <bb 5>;
> >
> > <bb 7>:
> >   pretmp.11_19 = 1 << k.0_9;
> >
> > <bb 4>:
> >   # i.1_34 = PHI <i.6_18(9), k.0_9(7)>
> >   D.2246_5 = pretmp.11_19;
> >   D.2248_7 = i.1_34 + D.2246_5;
> >   a_p.2_8 = &a[D.2248_7];
> >   a_p = a_p.2_8;
> >   b_p.3_13 = &b[D.2248_7];
> >   b_p = b_p.3_13;
> >   MEM[(int *)&a][D.2248_7] = 7;
> >   MEM[(int *)&b][D.2248_7] = 7;
> >   i.6_18 = k.0_9 + i.1_34;
> >   i = i.6_18;
> >   if (i.6_18 <= 511)
> >     goto <bb 9>;
> >   else
> >     goto <bb 8>;
> >
> > <bb 9>:
> >   goto <bb 4>;
> >
> > <bb 5>:
> > Invalid sum of incoming frequencies 81, should be 900
> >   k.7_20 = k.0_9 + 1;
> >   k = k.7_20;
> >   if (k.7_20 <= 9)
> >     goto <bb 11>;
> >   else
> >     goto <bb 6>;
> >
> > <bb 11>:
> >   goto <bb 3>;
> >
> > <bb 6>:
> >   return;
> >
> > }
> >
> > Can the following statements be sinked out of loop? I don't see this
> > optimization happen in trunk. The consequence is register pressure
> > increased
> > and a spill/fill occurs in RA.
> >
> >   a_p.2_8 = &a[D.2248_7];
> >   a_p = a_p.2_8;
> >   b_p.3_13 = &b[D.2248_7];
> >   b_p = b_p.3_13;
> >
> > I know the sink would happen in sink pass if a_p and b_p are local
> > variables.
> >
> > If this is the root cause, which optimization pass in GCC take the
> role
> > to
> > sink them out of loop? How should we get it fixed?
> >
> > Thanks,
> > -Jiangning
> >
> >
> >
> 
> 
> 
> 




Reply via email to