------- Additional Comments From dberlin at gcc dot gnu dot org  2005-01-15 
00:22 -------
Subject: Re:  New: missed optimization with
        ifs and deferencing

On Thu, 2005-01-13 at 21:38 +0000, pinskia at gcc dot gnu dot org wrote:
> I found this while looking into PR 8361 for missed optimization.
> The following two programs should produce the same asm:
> int f(int k, int i1, int j1)
> {
>   int *f1;
>   if(k)
>    f1 = &i1;
>   else
>    f1 = &j1;
>   return *f1;
> }


The only way you are going to get this to optimize is to make it see we
are derefencing a phi whose arguments are all is_gimple_min_invariant,
substitute the value in, merge it, and then use the that at the
derefence point.

This is actually just a special case of noticing that we are really
doing *&<something> in both cases, and removing the *& part, while
leaving the rest.


IE transform it like so

Step 0:
f (k, i1, j1)
{
  int * f1;
  int D.1116;

<bb 0>:
  if (k_2 != 0) goto <L2>; else goto <L4>;

<L4>:;

  # f1_1 = PHI <&i1(0), &j1(1)>;
<L2>:;
  #   VUSE <i1_7>;
  #   VUSE <j1_8>;
  D.1116_3 = *f1_1;
  return D.1116_3;

}
Step 1 (new blocks added for clarity)

f (k, i1, j1)
{
  int * f1;
  int D.1116;

<bb 0>:
  if (k_2 != 0) goto <L3>; else goto <L4>;

<L4>:;
newtemp_2 = i1;
goto L2

<L3>
newtemp_1 = j1;

f1_1 = PHI<&i1(0), &j1(1)>
<L2>:;
  #   VUSE <i1_7>;
  #   VUSE <j1_8>;
  D.1116_3 = *f1_1;
  return D.1116_3;

}

Step 2:
f (k, i1, j1)
{
  int * f1;
  int D.1116;

<bb 0>:
  if (k_2 != 0) goto <L3>; else goto <L4>;

<L4>:;
newtemp_2 = i1;
goto L2

<L3>
newtemp_1 = j1;

newphi = PHI<newtemp_2(0), newtemp_1(1)>
<L2>:;
  #   VUSE <i1_7>;
  #   VUSE <j1_8>;
  D.1116_3 = *f1_1;
  return D.1116_3;

}

Step 3:
f (k, i1, j1)
{
  int * f1;
  int D.1116;

<bb 0>:
  if (k_2 != 0) goto <L3>; else goto <L4>;

<L4>:;
newtemp_2 = i1;
goto L2

<L3>
newtemp_1 = j1;

newphi = PHI<newtemp_2(0), newtemp_1(1)>
<L2>:;
  D.1116_3 = newphi;
  return D.1116_3;

}

Notice that all i've done is simply match up that the dereference was of
a phi node whoes arguments are all &something.
In that specific case, we can remove all the addressing operations and
the dereference use, and just replace it with the values.





-- 


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

Reply via email to