Hi,
For test case gcc.dg/tree-ssa/ivopt_inter_2.c

#ifndef TYPE
#define TYPE char*
#endif

extern char a[];

/* Can not infer loop iteration from array -- exit test can not be replaced.  */
void foo (unsigned int i_width, TYPE dst)
{
  unsigned long long i = 0;
  unsigned long long j = 0;
  for ( ; j < i_width; )
    {
      *dst = a[i];
      dst++;
      i += 2;
      j += 1;
    }
}

/* { dg-final { scan-tree-dump-times "Replacing" 0 "ivopts"} } */
/* { dg-final { cleanup-tree-dump "ivopts" } } */

It checks whether the test is eliminated by address iv candidate,
which is fragile.
Giving the ivopt dump file :

foo (unsigned int i_width, char * dst)
{
  long long unsigned int j;
  long long unsigned int i;
  long long unsigned int _4;
  char _9;
  long long unsigned int _18;

  <bb 2>:
  _18 = (long long unsigned int) i_width_7(D);
  if (_18 != 0)
    goto <bb 3>;
  else
    goto <bb 7>;

  <bb 3>:

  <bb 4>:
  # j_21 = PHI <j_13(5), 0(3)>
  _9 = MEM[symbol: a, index: j_21, step: 2, offset: 0B];
  MEM[base: dst_5(D), index: j_21, offset: 0B] = _9;
  j_13 = j_21 + 1;
  if (j_13 < _18)
    goto <bb 5>;
  else
    goto <bb 6>;

  <bb 5>:
  goto <bb 4>;

  <bb 6>:

  <bb 7>:
  return;
}

It's possible to have  "if (j_13 < _18)" eliminated into "if (j_13 !=
_18)", and the case would fail because of dump message "Replacing exit
test: if (j_13 < _18)"

Same story for ivopt_mult_3.c

Any idea how it should be handled?

Thanks.
bin
--
Best Regards.

Reply via email to