From: H.J. Lu Date: Fri, 30 Jan 2009 22:36:22 +0000 (+0000) Subject: backport: re PR rtl-optimization/38245 (stack corruption when a call is removed but... X-Git-Tag: releases/gcc-4.3.4~366 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=09124146e22e1d7e240cb38c6be963415d41013a;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/38245 (stack corruption when a call is removed but not the outgoing argument pushes) 2009-01-30 H.J. Lu Backport from mainline: 2009-01-14 Jakub Jelinek PR rtl-optimization/38245 * gcc.dg/pr38245-3.c: New test. * gcc.dg/pr38245-3.h: New file. * gcc.dg/pr38245-4.c: New file. * gcc.dg/pr38364.c: New test. From-SVN: r143810 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fbe3d8a5d9d7..4df4cf2522ee 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2009-01-30 H.J. Lu + + Backport from mainline: + 2009-01-14 Jakub Jelinek + + PR rtl-optimization/38245 + * gcc.dg/pr38245-3.c: New test. + * gcc.dg/pr38245-3.h: New file. + * gcc.dg/pr38245-4.c: New file. + * gcc.dg/pr38364.c: New test. + 2009-01-30 Richard Guenther PR tree-optimization/39041 diff --git a/gcc/testsuite/gcc.dg/pr38245-3.c b/gcc/testsuite/gcc.dg/pr38245-3.c new file mode 100644 index 000000000000..6ef8372a14f2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr38245-3.c @@ -0,0 +1,112 @@ +/* PR rtl-optimization/38245 */ +/* { dg-do run } */ +/* { dg-additional-sources "pr38245-4.c" } */ +/* { dg-options "-O2" } */ + +#include "pr38245-3.h" + +extern void abort (void); + +struct A { int i, j; union { short s[4]; long long l; }; char pad[512]; } a; +int globv = 6; + +void __attribute__((noinline)) +f1 (void) +{ + a.s[2] = b1 (6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21); + a.l = 6; +} + +void __attribute__((noinline)) +f2 (void) +{ + a.s[2] = b2 (6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21); + a.l = 6; +} + +void __attribute__((noinline)) +f3 (void) +{ + struct B b = { 30, 31, { 32, 33 } }; + a.s[2] = b3 (6, 7, 8, 9, 10, 11, 12, b, 14, b, 16, b, 18, 19, 20, 21, + 6, b, 8, b, 10, 11, 12, 13, 14, b, 16, b, 18, 19, 20, 21); + a.l = 6; +} + +void __attribute__((noinline)) +f4 (void) +{ + struct B b = { 30, 31, { 32, 33 } }; + a.s[2] = b4 (6, 7, 8, 9, 10, 11, 12, b, 14, b, 16, b, 18, 19, 20, 21, + 6, b, 8, b, 10, 11, 12, 13, 14, b, 16, b, 18, 19, 20, 21); + a.l = 6; +} + +void __attribute__((noinline)) +f5 (void) +{ + a.s[2] = b5 (6.0, 7, 8, 9, 10, 11, 21.0, 22.0, 23.0); + a.l = 6; +} + +void __attribute__((noinline)) +f6 (void) +{ + a.s[2] = b6 (6.0, 7, 8, 9, 10, 11, 21.0, 22.0, 23.0); + a.l = 6; +} + +void __attribute__((noinline)) +f7 (void) +{ + a.s[2] = b7 (6, 7); + a.l = 6; +} + +void __attribute__((noinline)) +f8 (void) +{ + a.s[2] = b8 (6, 7); + a.l = 6; +} + +void __attribute__((noinline)) +f9 (void) +{ + a.s[2] = b9 (6, 7, 8, 9, 10, 11, 12); + a.l = 6; +} + +void __attribute__((noinline)) +f10 (void) +{ + a.s[2] = b10 (6, 7, 8, 9, 10, 11, 12); + a.l = 6; +} + +int +main (void) +{ + char buf[256]; + int i; + for (i = 0; i < (int) sizeof buf; i++) + buf[i] = i; + asm volatile ("" : : "r" (buf) : "memory"); + f1 (); + f2 (); + f3 (); + f4 (); + f5 (); + f6 (); + f7 (); + f8 (); + f9 (); + f10 (); + asm volatile ("" : : "r" (buf) : "memory"); + for (i = 0; i < (int) sizeof buf; i++) + if (buf[i] != (char) i) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/pr38245-3.h b/gcc/testsuite/gcc.dg/pr38245-3.h new file mode 100644 index 000000000000..b1c2a0f67c21 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr38245-3.h @@ -0,0 +1,35 @@ +/* PR rtl-optimization/38245 */ + +struct B { long a, b; char p[32]; }; +extern int globv; + +extern int b1 (long long, long, long, long, long, long, long, long, + long long, long, long, long, long, long, long, long, + long long, long, long, long, long, long, long, long, + long long, long, long, long, long, long, long, long) + __attribute__((pure, noinline)); +extern int b2 (long long, long, long, long, long, long, long, long, + long long, long, long, long, long, long, long, long, + long long, long, long, long, long, long, long, long, + long long, long, long, long, long, long, long, long) + __attribute__((const, noinline)); +extern int b3 (long long, long, long, long, long, long, long, struct B, + long long, struct B, long, struct B, long, long, long, long, + long long, struct B, long, struct B, long, long, long, long, + long long, struct B, long, struct B, long, long, long, long) + __attribute__((pure, noinline)); +extern int b4 (long long, long, long, long, long, long, long, struct B, + long long, struct B, long, struct B, long, long, long, long, + long long, struct B, long, struct B, long, long, long, long, + long long, struct B, long, struct B, long, long, long, long) + __attribute__((const, noinline)); +extern int b5 () __attribute__((pure, noinline)); +extern int b6 () __attribute__((const, noinline)); +extern int b7 (int, int) + __attribute__((pure, noinline)); +extern int b8 (int, int) + __attribute__((const, noinline)); +extern int b9 (int, int, int, int, int, int, int) + __attribute__((pure, noinline)); +extern int b10 (int, int, int, int, int, int, int) + __attribute__((const, noinline)); diff --git a/gcc/testsuite/gcc.dg/pr38245-4.c b/gcc/testsuite/gcc.dg/pr38245-4.c new file mode 100644 index 000000000000..c9b3d2d8fb81 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr38245-4.c @@ -0,0 +1,107 @@ +/* PR rtl-optimization/38245 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +#include "pr38245-3.h" + +int +b1 (long long a1, long a2, long a3, long a4, + long a5, long a6, long a7, long a8, + long long a9, long a10, long a11, long a12, + long a13, long a14, long a15, long a16, + long long a17, long a18, long a19, long a20, + long a21, long a22, long a23, long a24, + long long a25, long a26, long a27, long a28, + long a29, long a30, long a31, long a32) +{ + return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + + a11 + a12 + a13 + a14 + a15 + a16 + a17 + a18 + a19 + a20 + + a21 + a22 + a23 + a24 + a25 + a26 + a27 + a28 + a29 + a30 + + a31 + a32 + globv; +} + +int +b2 (long long a1, long a2, long a3, long a4, + long a5, long a6, long a7, long a8, + long long a9, long a10, long a11, long a12, + long a13, long a14, long a15, long a16, + long long a17, long a18, long a19, long a20, + long a21, long a22, long a23, long a24, + long long a25, long a26, long a27, long a28, + long a29, long a30, long a31, long a32) +{ + return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + + a11 + a12 + a13 + a14 + a15 + a16 + a17 + a18 + a19 + a20 + + a21 + a22 + a23 + a24 + a25 + a26 + a27 + a28 + a29 + a30 + + a31 + a32; +} + +int +b3 (long long a1, long a2, long a3, long a4, + long a5, long a6, long a7, struct B a8, + long long a9, struct B a10, long a11, struct B a12, + long a13, long a14, long a15, long a16, + long long a17, struct B a18, long a19, struct B a20, + long a21, long a22, long a23, long a24, + long long a25, struct B a26, long a27, struct B a28, + long a29, long a30, long a31, long a32) +{ + return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8.a + a9 + a10.a + + a11 + a12.a + a13 + a14 + a15 + a16 + a17 + a18.a + a19 + a20.a + + a21 + a22 + a23 + a24 + a25 + a26.a + a27 + a28.a + a29 + a30 + + a31 + a32 + globv; +} + +int +b4 (long long a1, long a2, long a3, long a4, + long a5, long a6, long a7, struct B a8, + long long a9, struct B a10, long a11, struct B a12, + long a13, long a14, long a15, long a16, + long long a17, struct B a18, long a19, struct B a20, + long a21, long a22, long a23, long a24, + long long a25, struct B a26, long a27, struct B a28, + long a29, long a30, long a31, long a32) +{ + return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8.a + a9 + a10.a + + a11 + a12.a + a13 + a14 + a15 + a16 + a17 + a18.a + a19 + a20.a + + a21 + a22 + a23 + a24 + a25 + a26.a + a27 + a28.a + a29 + a30 + + a31 + a32; +} + +int +b5 (double a1, int a2, int a3, int a4, int a5, int a6, double a7, + double a8, double a9) +{ + return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + globv; +} + +int +b6 (double a1, int a2, int a3, int a4, int a5, int a6, double a7, + double a8, double a9) +{ + return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9; +} + +int +b7 (int a1, int a2) +{ + return a1 + a2 + globv; +} + +int +b8 (int a1, int a2) +{ + return a1 + a2; +} + +int +b9 (int a1, int a2, int a3, int a4, int a5, int a6, int a7) +{ + return a1 + a2 + a3 + a4 + a5 + a6 + a7 + globv; +} + +int +b10 (int a1, int a2, int a3, int a4, int a5, int a6, int a7) +{ + return a1 + a2 + a3 + a4 + a5 + a6 + a7; +} diff --git a/gcc/testsuite/gcc.dg/pr38364.c b/gcc/testsuite/gcc.dg/pr38364.c new file mode 100644 index 000000000000..23f72de74ee4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr38364.c @@ -0,0 +1,79 @@ +/* PR middle-end/38364 */ +/* { dg-do run } */ +/* { dg-options "-O2 -ftrapv" } */ + +extern void abort (void); + +static inline short +f1 (short x, short y) +{ + if (x > 0) + { + if (y > 0) + { + if (x > __SHRT_MAX__ / y) + return x; + } + else if (y < (-__SHRT_MAX__ - 1) / x) + return x; + } + else + { + if (y > 0) + { + if (x < (-__SHRT_MAX__ - 1) / y) + return x; + } + else if (x != 0 && y < __SHRT_MAX__ / x) + return x; + } + return x * y; +} + +static inline signed char +f2 (signed char x, signed char y) +{ + if (((x ^ y) & (((x ^ ((x ^ y) & (1 << (__CHAR_BIT__ - 1)))) - y) ^ y)) < 0) + return x; + return x - y; +} + +unsigned int v; + +int +f3 (int x, unsigned int y) +{ + f1 (1, 1); + return 1; +} + +int +f4 (unsigned short x) +{ + v = x; + return 1; +} + +int +f5 (int x) +{ + if (f2 (x, 1)) + f1 (1, f4 (1)); + return x; +} + +int +f6 (unsigned int x) +{ + f4 (x < (1 != f5 (0))); + return x; +} + +int +main (void) +{ + f6 (1); + if (v != 0) + abort (); + return 0; +}