Hello,

Consider this test case:

---------------------- 8< ----------------
int a;
__attribute__((__noinline__,__noclone__,__pure__))
int use (int b)
{
  return b * 2 + 4 + a;
}

int foo (int b, int c, int d)
{
  int res, r = 0;
  res = use (b);
  if (c)
    r = res;
  return r;
}
---------------------- 8< ----------------

I would expect the "res = use(b)" statement to be sinkable, but this
doesn't happen. There are strange VOPs on the return statements, even
though they return a GIMPLE register, AFAICT:

use (int b)
{
  int a.0;
  int _2;
  int _3;
  int _6;
  <bb 2>:
  _2 = b_1(D) + 2;
  _3 = _2 * 2;
  # VUSE <.MEM_4(D)>
  a.0_5 = a;
  _6 = _3 + a.0_5;
  # VUSE <.MEM_4(D)>
  return _6;
}

foo (int b, int c, int d)
{
  int r;
  <bb 2>:
  # VUSE <.MEM_2(D)>
  r_4 = use (b_3(D));
  if (c_5(D) != 0)
    goto <bb 3>;
  else
    goto <bb 5>;
  <bb 5>:
  goto <bb 4>;
  <bb 3>:
  <bb 4>:
  # r_1 = PHI <0(5), r_4(3)>
  # VUSE <.MEM_2(D)>
  return r_1;
}

Why are those VUSEs there?

Ciao!
Steven

Reply via email to