]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR rtl-optimization/38245 (stack corruption when a call is removed but...
authorH.J. Lu <hongjiu.lu@intel.com>
Fri, 30 Jan 2009 22:36:22 +0000 (22:36 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Fri, 30 Jan 2009 22:36:22 +0000 (14:36 -0800)
2009-01-30  H.J. Lu  <hongjiu.lu@intel.com>

Backport from mainline:
2009-01-14  Jakub Jelinek  <jakub@redhat.com>

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

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr38245-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr38245-3.h [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr38245-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr38364.c [new file with mode: 0644]

index fbe3d8a5d9d7d5eb2584db03551cc372ce7340ed..4df4cf2522eecffcd8facd8cc35775a9d50ed8f8 100644 (file)
@@ -1,3 +1,14 @@
+2009-01-30  H.J. Lu  <hongjiu.lu@intel.com>
+
+       Backport from mainline:
+       2009-01-14  Jakub Jelinek  <jakub@redhat.com>
+
+       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  <rguenther@suse.de>
 
        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 (file)
index 0000000..6ef8372
--- /dev/null
@@ -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 (file)
index 0000000..b1c2a0f
--- /dev/null
@@ -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 (file)
index 0000000..c9b3d2d
--- /dev/null
@@ -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 (file)
index 0000000..23f72de
--- /dev/null
@@ -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;
+}