This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/19579] New: -march=i686 generates a bogus program


The following program:

/*----------8<-----------------------*/
int printf(const char *, ...);

int f(void)
{
	return 0;	
}

void g(int a[])
{
	int n3, n0;
	int even;
	int diff = a[1] - a[0];

	n3 = 3;
	if ((n0 = f()) > 0) {
		even = diff + 2 * (n3 - n0);
	} else {
		even = diff + 2 * n3 + 1;
		if (even > 0) even++;
		else if (even < 0) even--;
	}

	if (even % 2 == 0) {
		printf("OK! even = %d\n", even);
	} else {
		printf("WRONG! even = %d\n", even);
	}
}

int main(void)
{
	int a[2] = {46, 16};
	g(a);
	return 0;
}
/*----------8<-----------------------*/

when compiled with:
    $ gcc-3.4.3 bug.c -o bug -O2 -march=i686

displays when executed:
    WRONG! even = -23

whereas when compiled with:
    $ gcc-3.4.3 bug.c -o bug -O2

gives the expected output:
    OK! even = -24

The bug is also exhibited when some others -march options are used, like
-march=athlon-xp.

gcc-3.4.3 -v output is:
Reading specs from
/home/richard/programs/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/specs
Configured with: /home/richard/tmp/gcc/gcc-3.4.3/configure
--prefix=/home/richard/programs/gcc-3.4.3 --program-suffix=-3.4.3
--enable-threads=posix --enable-languages=c,c++
Thread model: posix
gcc version 3.4.3

bug.i:
# 1 "bug.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bug.c"
int printf(const char *, ...);

int f(void)
{
 return 0;
}

void g(int a[])
{
 int n3, n0;
 int even;
 int diff = a[1] - a[0];

 n3 = 3;
 if ((n0 = f()) > 0) {
  even = diff + 2 * (n3 - n0);
 } else {
  even = diff + 2 * n3 + 1;
  if (even > 0) even++;
  else if (even < 0) even--;
 }

 if (even % 2 == 0) {
  printf("OK! even = %d\n", even);
 } else {
  printf("WRONG! even = %d\n", even);
 }
}

int main(void)
{
 int a[2] = {46, 16};
 g(a);
 return 0;
}

-- 
           Summary: -march=i686 generates a bogus program
           Product: gcc
           Version: 3.4.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: abulmo at club-internet dot fr
                CC: gcc-bugs at gcc dot gnu dot org
  GCC host triplet: gcc-3.4.3/gentoo-linux/athlon-xp 2500+


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]