patches/gcc/3.3.1/pr11736-1-test.patch
changeset 1 eeea35fbf182
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/patches/gcc/3.3.1/pr11736-1-test.patch	Sat Feb 24 11:00:05 2007 +0000
     1.3 @@ -0,0 +1,48 @@
     1.4 +--- /dev/null	Sat Dec 14 13:56:51 2002
     1.5 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11736-1.c	Sun Sep 14 14:26:33 2003
     1.6 +@@ -0,0 +1,45 @@
     1.7 ++/* PR optimization/11736
     1.8 ++ * Reporter: marcus@mc.pp.se
     1.9 ++ * Summary:  Stackpointer messed up on SuperH
    1.10 ++ * Keywords: wrong-code
    1.11 ++ * Description:
    1.12 ++ * When a function with 5 arguments is called in both branches of a
    1.13 ++ * conditional, and only the last argument differs, the code to push that
    1.14 ++ * last argument on the stack gets confused. 
    1.15 ++ * Space for the fifth argument is reserved on the stack by the
    1.16 ++ * instruction I have marked as "A".  However, if the else-branch is
    1.17 ++ * taken the stackpointer is decremented _again_ at "B".  This
    1.18 ++ * decrementation is never restored, and it is only due to the
    1.19 ++ * restoration of r15 from r14 that the function works at all.  With
    1.20 ++ * -fomit-frame-pointer it will crash.
    1.21 ++ *
    1.22 ++ * Testcase tweaked by dank@kegel.com
    1.23 ++ * Not marked as xfail since it's a regression from hardhat 2.0 gcc-2.97 
    1.24 ++ * and dodes gcc-3.0.2
    1.25 ++ */
    1.26 ++
    1.27 ++/* { dg-do run } */
    1.28 ++/* { dg-options "-O1 -fomit-frame-pointer" } */
    1.29 ++
    1.30 ++int expected_e;
    1.31 ++
    1.32 ++void bar(int a, int b, int c, int d, int e)
    1.33 ++{
    1.34 ++	if (e != expected_e)
    1.35 ++		abort();
    1.36 ++}
    1.37 ++
    1.38 ++void foo(int a)
    1.39 ++{
    1.40 ++	if (a)
    1.41 ++		bar(0, 0, 0, 0, 1);
    1.42 ++	else
    1.43 ++		bar(0, 0, 0, 0, 0);	/* stack pointer decremented extra time here, causing segfault */
    1.44 ++}
    1.45 ++
    1.46 ++int main(int argc, char **argv)
    1.47 ++{
    1.48 ++	for (expected_e = 0; expected_e < 2; expected_e++)
    1.49 ++		foo(expected_e);
    1.50 ++	return 0;
    1.51 ++}