http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52558

--- Comment #16 from Aldy Hernandez <aldyh at gcc dot gnu.org> 2012-04-11 
13:37:17 UTC ---
(In reply to comment #15)

> Both value-numbering (FRE/PRE, that do not run after store motion :/) and
> DOM should figure this out.  DOM only in theory, but at least in this simple
> case it should figure it out.  Do you have a testcase that does not require
> your patches?

On a pristine trunk I don't have the exact problem (since the equality in
comment 14 was created by my WIP), but I do have a similar problem where no
optimization can figure out that g_2_lsm == g_2.

Here is a variation of the PR testcase:

int g_1 = 1;
int g_2 = 0;

int func_1(void)
{
  int l;
  for (l = 0; l < 1234; l++)
  { 
    if (g_1)
      return l;
    else
      g_2 = 0;
  }
  return 999;
}

On pristine trunk, we get:

  # VUSE <.MEM_9(D)>
  g_2_lsm.6_12 = g_2;           <-- g_2_lsm = g_2
  if (pretmp.4_1 != 0)
    goto <bb 4>;
  else
    goto <bb 3>;

<bb 3>:
  # .MEM_8 = VDEF <.MEM_9(D)>
  g_2 = 0;
  goto <bb 5>;

<bb 4>:
  # .MEM_16 = VDEF <.MEM_9(D)>
  g_2 = g_2_lsm.6_12;           <-- g_2_lsm == g_2!!

This may actually be the problem in this PR.  If we could figure out that
g_2_lsm == g_2, there would be no write to g_2 on the g_1!=0 arm of the
conditional.

Should DOM be able to figure out that g_2_lsm == g_2 in this case as well?

Thanks.

Reply via email to