The following testcase calls abort when it is compiled with
-O3 -ftree-loop-distribution.

/* Derived from gcc.c-torture/execute/20010910-1.c.  */

extern void abort(void);

struct epic_private
{
  unsigned int *rx_ring;
  unsigned int rx_skbuff[5];
};

int
main (void)
{
  struct epic_private ep;
  unsigned int rx_ring[5];
  int i;

  ep.rx_skbuff[0] = 5;

  ep.rx_ring = rx_ring;

  for (i = 0; i < 5; i++)
    {
      ep.rx_ring[i] = i;
      ep.rx_skbuff[i] = 0;
    }

  if (ep.rx_skbuff[0] != 0)
    abort ();

  return 0;
}

The loop distribution pass produces:

<bb 2>:
  ep.rx_skbuff[0] = 5;

<bb 8>:
  # i_22 = PHI <i_36(9), 0(2)>
  D.1604_11 = (long unsigned int) i_22;
  D.1605_30 = D.1604_11 * 4;
  D.1606_31 = &rx_ring + D.1605_30;
  i.0_32 = (unsigned int) i_22;
  *D.1606_31 = i.0_32;
  i_36 = i_22 + 1;
  if (i_36 <= 4)
    goto <bb 9>;
  else
    goto <bb 10>;

<bb 9>:
  goto <bb 8>;

<bb 10>:
Invalid sum of outgoing probabilities 0.0%
  D.1642_37 = &ep + 8;
  __builtin_memset (D.1642_37, 0, 20);

<bb 5>:
Invalid sum of incoming frequencies 0, should be 1667
  D.1609_10 = ep.rx_skbuff[0];
  if (D.1609_10 != 0)
    goto <bb 6>;
  else
    goto <bb 7>;

<bb 6>:
  abort ();

<bb 7>:
  return 0;

dom2 in turn produces:

  ep.rx_skbuff[0] = 5;
  rx_ring[0] = 0;
  D.1606_47 = &rx_ring[1];
  rx_ring[1] = 1;
  D.1606_59 = &rx_ring[2];
  rx_ring[2] = 2;
  D.1606_71 = &rx_ring[3];
  rx_ring[3] = 3;
  D.1606_31 = &rx_ring[4];
  rx_ring[4] = 4;
  D.1642_37 = &ep + 8;
  __builtin_memset (D.1642_37, 0, 20);
  D.1609_10 = 5;
  abort ();

Note that the end of the function is replaced with an unconditional
abort.

GCC puts an unconditional abort at the rtl level when compiling The
original gcc.c-torture/execute/20010910-1.c.  Once I remove extra
source code, I can observe an unconditional abort at the tree level.

The compiler probably does not notice that the value of
ep.rx_skbuff[0] changes across __builtin_memset.  This sounds like an
alias problem of some sort.


-- 
           Summary: wrong code generated with -ftree-loop-disttribution
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: kazu at gcc dot gnu dot org
 GCC build triplet: x86_64-unknown-linux-gnu
  GCC host triplet: x86_64-unknown-linux-gnu
GCC target triplet: x86_64-unknown-linux-gnu


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

Reply via email to