This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]