[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc
Subject:    Why can't copy renaming capture this assignment?
From:       "Jiangning Liu" <jiangning.liu () arm ! com>
Date:       2012-03-31 4:23:19
Message-ID: 000001cd0ef6$02829b70$0787d250$ () liu () arm ! com
[Download RAW message or body]

Hi,

For this small case, 

char garr[100];
void f(void)
{
        unsigned short h, s;

        s = 20;

        for (h = 1; h < (s-1); h++)
        {
                garr[h] = 0;
        }
}

After copyrename3, we have the following dump,

f ()
{
  short unsigned int h;
  int D.4066;

<bb 2>:
  D.4066_14 = 1;
  if (D.4066_14 <= 18)
    goto <bb 3>;
  else
    goto <bb 4>;

<bb 3>:
  # h_15 = PHI <h_8(3), 1(2)>
  # D.4066_16 = PHI <D.4066_4(3), D.4066_14(2)>
  garr[D.4066_16] = 0;
  h_8 = h_15 + 1;
  D.4066_4 = (int) h_8;
  if (D.4066_4 <= 18)
    goto <bb 3>;
  else
    goto <bb 4>;

<bb 4>:
  return;

}

copy renaming fails to capture the assignment statement "D.4066_4 = (int)
h_8;" to trigger renaming partition coalesce. 

I find gimple_assign_single_p invoked by gimple_assign_ssa_name_copy_p
always returns false, because for this statement " gs->gsbase.subcode" is
NOP_EXPR rather than GIMPLE_SINGLE_RHS.

Should subcode be correctly initialized anywhere to fix this problem?

BTW, my expectation after copy renaming is like below, 

f ()
{
  int D.4679;

<bb 2>:
  D.4679_7 = 1;
  if (D.4679_7 != 19)
    goto <bb 3>;
  else
    goto <bb 4>;

<bb 3>:
  # D.4679_15 = PHI <D.4679_4(3), D.4679_7(2)>
  # D.4679_17 = PHI <D.4679_14(3), 1(2)>
  garr[D.4679_15] = 0;
  D.4679_14 = D.4679_17 + 1;
  D.4679_4 = D.4679_14;
  if (D.4679_4 != 19)
    goto <bb 3>;
  else
    goto <bb 4>;

<bb 4>:
  return;

}

and then PRE can finally remove that redundancy for symbol D.xxxx away.

Thanks,
-Jiangning





[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic