This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
c/4258: gcc-2.95.2 produces wrong code
- To: gcc-gnats at gcc dot gnu dot org
- Subject: c/4258: gcc-2.95.2 produces wrong code
- From: rohloff at in dot tum dot de
- Date: 7 Sep 2001 15:42:53 -0000
- Reply-To: rohloff at in dot tum dot de
>Number: 4258
>Category: c
>Synopsis: gcc-2.95.2 produces wrong code
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: wrong-code
>Submitter-Id: net
>Arrival-Date: Fri Sep 07 08:46:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Ingo Rohloff
>Release: gcc-2.95.2
>Organization:
>Environment:
Linux 2.4.9 i686
>Description:
Compiling the attached code with -O2 produces a
binary which skips a loop iteration.
>How-To-Repeat:
Compile the following code with -O2 and execute
the resulting binary.
------------------------------------------------
struct epic_rx_desc {
unsigned int next;
};
struct epic_private {
struct epic_rx_desc *rx_ring;
unsigned int rx_ring_dma;
unsigned char* rx_skbuff[32];
};
static void epic_init_ring(struct epic_private *ep)
{
int i;
for (i = 0; i < 32; i++) {
ep->rx_ring[i].next = ep->rx_ring_dma +
(i+1)*sizeof(struct epic_rx_desc);
ep->rx_skbuff[i] = 0;
}
ep->rx_ring[i-1].next = ep->rx_ring_dma;
}
int main()
{
struct epic_private ep;
struct epic_rx_desc rx_ring[32];
int i;
for (i=0;i<32;i++)
rx_ring[i].next=0;
ep.rx_ring=rx_ring;
ep.rx_ring_dma=(unsigned int)rx_ring;
epic_init_ring(&ep);
for (i=0;i<5;i++)
{
printf("%8X\n",ep.rx_ring[i].next);
}
}
>Fix:
Compile with -O1.
>Release-Note:
>Audit-Trail:
>Unformatted: