[Bug c++/39163] New: -mstackalign breaks -O2 optimization using g++
gyunaev at ulduzsoft dot com
gcc-bugzilla@gcc.gnu.org
Thu Feb 12 04:18:00 GMT 2009
This is basically a copy of bug report from
http://www.dribin.org/dave/blog/archives/2006/12/05/missing_third_param/
Using the following sample file saved as test.c:
----------------------------------------------------------------------------
#include <stdio.h>
#define NOINLINE __attribute__((noinline))
NOINLINE static void foo1(int i1)
{
printf("foo1: %d\n", i1);
}
NOINLINE static void foo2(int i1, int i2)
{
printf("foo2: %d, %d\n", i1, i2);
}
NOINLINE static void foo3(int i1, int i2, int i3)
{
printf("foo3: %d, %d, %d\n", i1, i2, i3);
}
NOINLINE static void foo4(int i1, int i2, int i3, int i4)
{
printf("foo4: %d, %d, %d, %d\n", i1, i2, i3, i4);
}
NOINLINE static void foo5(int i1, int i2, int i3, int i4, int i5)
{
printf("foo5: %d, %d, %d, %d, %d\n", i1, i2, i3, i4, i5);
}
NOINLINE static void foo6(int i1, int i2, int i3, int i4, int i5, int i6)
{
printf("foo6: %d, %d, %d, %d, %d, %d\n", i1, i2, i3, i4, i5, i6);
}
int main(int argc, char **argv)
{
foo1(1);
foo2(1, 2);
foo3(1, 2, 3);
foo4(1, 2, 3, 4);
foo5(1, 2, 3, 4, 5);
foo6(1, 2, 3, 4, 5, 6);
return 0;
}
----------------------------------------------------------------------------
produces invalid output (broken 3rd parameter) if compiled using g++ and
-mstackrealign:
> /usr/toolchains/gcc433/bin/g++ -Wall -mstackrealign -O2 test.c
> ./a.out
foo1: 1
foo2: 1, 2
foo3: 1, 2, -1209632279
foo4: 1, 2, 4, 134520820
foo5: 1, 2, 4, 5, -1074446840
foo6: 1, 2, 4, 5, 6, 134514537
However if gcc is used instead of g++, valid output is generated:
> /usr/toolchains/gcc433/bin/gcc -mstackrealign -Wall -O2 test.c
> ./a.out
foo1: 1
foo2: 1, 2
foo3: 1, 2, 3
foo4: 1, 2, 3, 4
foo5: 1, 2, 3, 4, 5
foo6: 1, 2, 3, 4, 5, 6
Analyze of assembly dump revealed that GCC still uses ECX in main() to pass the
parameter. ix86_internal_arg_pointer() in i386.c works fine, and returns same
values for gcc and g++, so the problem is not there.
--
Summary: -mstackalign breaks -O2 optimization using g++
Product: gcc
Version: 4.3.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: gyunaev at ulduzsoft dot com
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39163
More information about the Gcc-bugs
mailing list