This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/22230] New: [4.1 Regression] value range propagation error
- From: "paul dot woegerer at nsc dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 29 Jun 2005 13:29:37 -0000
- Subject: [Bug c/22230] New: [4.1 Regression] value range propagation error
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
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