Since i've updated the crx-port from snapshot 4_1_20050508
to 4_1_20050625 i get wrong code for the example below.
(compiled with -O2)

If i turn off value range propagation (-fno-tree-vrp) the
generated code is correct.

/***************** Tree dump before vrp ******************/

main ()
{
  struct cls arr[64];
  struct cls * ptr;
  int i;
  int D.1170;
  long int D.1169;
  short int D.1168;
  int D.1167;
  char D.1166;
  int i.0;

<bb 0>:
  goto <bb 2> (<L1>);

<L0>:;
  i_11 = i_1;
  D.1166_12 = (char) i_1;
  arr[i_1].c = D.1166_12;
  i_14 = i_1;
  D.1167_15 = i_1 * i_1;
  arr[i_1].l = D.1167_15;
  i_17 = i_1;
  D.1168_18 = (short int) i_1;
  arr[i_1].s = D.1168_18;
  i_20 = i_1 + 1;

  # i_1 = PHI <0(0), i_20(1)>;
<L1>:;
  if (i_1 <= 63) goto <L0>; else goto <L2>;

<L2>:;
  D.1169_7 = arr[7].l;
  if (D.1169_7 != 49) goto <L3>; else goto <L5>;

<L3>:;

  # D.1170_3 = PHI <1(4), 0(3)>;
<L5>:;
  return D.1170_3;

}

/***************** Tree dump after vrp *******************/

Value ranges after VRP:

i_1: VARYING
arr_2: VARYING
D.1170_3: VARYING
D.1169_7: VARYING
<retval>_8: VARYING
i_9: [0, 63]  EQUIVALENCES: { i_1 } (1 elements)
i_11: [0, 63]  EQUIVALENCES: { i_1 i_9 } (2 elements)
D.1166_12: [0, 63]  EQUIVALENCES: { } (0 elements)
i_14: [0, 63]  EQUIVALENCES: { i_1 i_9 } (2 elements)
D.1167_15: [0, 0]  EQUIVALENCES: { } (0 elements) ??? Why is that ???
i_17: [0, 63]  EQUIVALENCES: { i_1 i_9 } (2 elements)
D.1168_18: [0, 63]  EQUIVALENCES: { } (0 elements)
i_20: [1, 64]  EQUIVALENCES: { } (0 elements)


main ()
{
  struct cls arr[64];
  struct cls * ptr;
  int i;
  int D.1170;
  long int D.1169;
  short int D.1168;
  int D.1167;
  char D.1166;
  int i.0;

<bb 0>:
  goto <bb 2> (<L1>);

<L0>:;
  i_11 = i_1;
  D.1166_12 = (char) i_1;
  arr[i_1].c = D.1166_12;
  i_14 = i_1;
  D.1167_15 = i_1 * i_1;
  arr[i_1].l = 0; ??? Why is that ???
  i_17 = i_1;
  D.1168_18 = (short int) i_1;
  arr[i_1].s = D.1168_18;
  i_20 = i_1 + 1;

  # i_1 = PHI <0(0), i_20(1)>;
<L1>:;
  if (i_1 <= 63) goto <L0>; else goto <L2>;

<L2>:;
  D.1169_7 = arr[7].l;
  if (D.1169_7 != 49) goto <L3>; else goto <L5>;

<L3>:;

  # D.1170_3 = PHI <1(4), 0(3)>;
<L5>:;
  return D.1170_3;

}

/********************** testfile.c ***********************/

typedef struct {
  char c;
  long l;
  short s;
} cls;

int main()
{
  int             i;

  cls * ptr, arr[64];

  for (i = 0; i < 64; i++) {
    arr[i].c = i;
    arr[i].l = i * i;
    arr[i].s = i;
  }

  ptr = arr + 7;
  if (ptr->l != 49) {
    return 1;
  }

  return 0;
}

-- 
           Summary: [4.1 Regression] value range propagation error
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: critical
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: paul dot woegerer at nsc dot com
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: crx-unknown-elf


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

Reply via email to