re PR middle-end/83487 (ICE in expand_call, at calls.c:4098)
authorJakub Jelinek <jakub@redhat.com>
Thu, 21 Dec 2017 23:10:45 +0000 (00:10 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 21 Dec 2017 23:10:45 +0000 (00:10 +0100)
PR middle-end/83487
* config/i386/i386.c (ix86_function_arg_boundary): Return
PARM_BOUNDARY for TYPE_EMPTY_P types.

* gcc.c-torture/compile/pr83487.c: New test.
* gcc.dg/compat/pr83487-1.h: New file.
* gcc.dg/compat/pr83487-1_main.c: New test.
* gcc.dg/compat/pr83487-1_x.c: New file.
* gcc.dg/compat/pr83487-1_y.c: New file.
* gcc.dg/compat/pr83487-2_main.c: New test.
* gcc.dg/compat/pr83487-2_x.c: New file.
* gcc.dg/compat/pr83487-2_y.c: New file.
* g++.dg/abi/pr83487.C: New test.
* g++.dg/compat/abi/pr83487-1_main.C: New test.
* g++.dg/compat/abi/pr83487-1_x.C: New file.
* g++.dg/compat/abi/pr83487-1_y.C: New file.
* g++.dg/compat/abi/pr83487-2_main.C: New test.
* g++.dg/compat/abi/pr83487-2_x.C: New file.
* g++.dg/compat/abi/pr83487-2_y.C: New file.

From-SVN: r255961

18 files changed:
gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/pr83487.C [new file with mode: 0644]
gcc/testsuite/g++.dg/compat/abi/pr83487-1_main.C [new file with mode: 0644]
gcc/testsuite/g++.dg/compat/abi/pr83487-1_x.C [new file with mode: 0644]
gcc/testsuite/g++.dg/compat/abi/pr83487-1_y.C [new file with mode: 0644]
gcc/testsuite/g++.dg/compat/abi/pr83487-2_main.C [new file with mode: 0644]
gcc/testsuite/g++.dg/compat/abi/pr83487-2_x.C [new file with mode: 0644]
gcc/testsuite/g++.dg/compat/abi/pr83487-2_y.C [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/pr83487.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/compat/pr83487-1.h [new file with mode: 0644]
gcc/testsuite/gcc.dg/compat/pr83487-1_main.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/compat/pr83487-1_x.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/compat/pr83487-1_y.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/compat/pr83487-2_main.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/compat/pr83487-2_x.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/compat/pr83487-2_y.c [new file with mode: 0644]

index 082223d..585a70b 100644 (file)
@@ -1,5 +1,9 @@
 2017-12-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/83487
+       * config/i386/i386.c (ix86_function_arg_boundary): Return
+       PARM_BOUNDARY for TYPE_EMPTY_P types.
+
        PR c/83448
        * gimple-ssa-sprintf.c (maybe_warn): Don't call set_caret_index
        if navail is >= dir.len.
index beeabff..8d02eb2 100644 (file)
@@ -8973,6 +8973,8 @@ ix86_function_arg_boundary (machine_mode mode, const_tree type)
         the main variant type.  */
       type = TYPE_MAIN_VARIANT (type);
       align = TYPE_ALIGN (type);
+      if (TYPE_EMPTY_P (type))
+       return PARM_BOUNDARY;
     }
   else
     align = GET_MODE_ALIGNMENT (mode);
index 2f5fd08..df630ad 100644 (file)
@@ -1,5 +1,22 @@
 2017-12-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/83487
+       * gcc.c-torture/compile/pr83487.c: New test.
+       * gcc.dg/compat/pr83487-1.h: New file.
+       * gcc.dg/compat/pr83487-1_main.c: New test.
+       * gcc.dg/compat/pr83487-1_x.c: New file.
+       * gcc.dg/compat/pr83487-1_y.c: New file.
+       * gcc.dg/compat/pr83487-2_main.c: New test.
+       * gcc.dg/compat/pr83487-2_x.c: New file.
+       * gcc.dg/compat/pr83487-2_y.c: New file.
+       * g++.dg/abi/pr83487.C: New test.
+       * g++.dg/compat/abi/pr83487-1_main.C: New test.
+       * g++.dg/compat/abi/pr83487-1_x.C: New file.
+       * g++.dg/compat/abi/pr83487-1_y.C: New file.
+       * g++.dg/compat/abi/pr83487-2_main.C: New test.
+       * g++.dg/compat/abi/pr83487-2_x.C: New file.
+       * g++.dg/compat/abi/pr83487-2_y.C: New file.
+
        PR c/83448
        * gcc.c-torture/compile/pr83448.c: New test.
        * gcc.dg/tree-ssa/builtin-snprintf-warn-4.c: New test.
diff --git a/gcc/testsuite/g++.dg/abi/pr83487.C b/gcc/testsuite/g++.dg/abi/pr83487.C
new file mode 100644 (file)
index 0000000..b1ef1bf
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR middle-end/83487 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct __attribute__ ((__aligned__)) A {};
+struct A a;
+void bar (int, int, int, int, int, int, int, struct A);
+
+void
+foo ()
+{
+  bar (0, 1, 2, 3, 4, 5, 6, a);
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-1_main.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-1_main.C
new file mode 100644 (file)
index 0000000..cd7cd94
--- /dev/null
@@ -0,0 +1,8 @@
+extern void do_test (void);
+
+int
+main ()
+{
+  do_test ();
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-1_x.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-1_x.C
new file mode 100644 (file)
index 0000000..f214647
--- /dev/null
@@ -0,0 +1 @@
+#include "../../../gcc.dg/compat/pr83487-1_x.c"
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-1_y.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-1_y.C
new file mode 100644 (file)
index 0000000..fc51498
--- /dev/null
@@ -0,0 +1 @@
+#include "../../../gcc.dg/compat/pr83487-1_y.c"
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-2_main.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-2_main.C
new file mode 100644 (file)
index 0000000..cd7cd94
--- /dev/null
@@ -0,0 +1,8 @@
+extern void do_test (void);
+
+int
+main ()
+{
+  do_test ();
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-2_x.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-2_x.C
new file mode 100644 (file)
index 0000000..c24fd60
--- /dev/null
@@ -0,0 +1 @@
+#include "../../../gcc.dg/compat/pr83487-2_x.c"
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-2_y.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-2_y.C
new file mode 100644 (file)
index 0000000..e5253d2
--- /dev/null
@@ -0,0 +1 @@
+#include "../../../gcc.dg/compat/pr83487-2_y.c"
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr83487.c b/gcc/testsuite/gcc.c-torture/compile/pr83487.c
new file mode 100644 (file)
index 0000000..9effb1e
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR middle-end/83487 */
+
+struct __attribute__ ((aligned)) A {};
+struct A a;
+void bar (int, int, int, int, int, int, int, struct A);
+
+void
+foo (void)
+{
+  bar (0, 1, 2, 3, 4, 5, 6, a);
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-1.h b/gcc/testsuite/gcc.dg/compat/pr83487-1.h
new file mode 100644 (file)
index 0000000..f39d5fd
--- /dev/null
@@ -0,0 +1,9 @@
+#ifdef PR83487_LARGE
+struct __attribute__ ((aligned (128))) A {};
+struct B {};
+struct C { struct B c[128]; };
+#else
+struct __attribute__ ((aligned (16))) A {};
+struct B {};
+struct C { struct B c[16]; };
+#endif
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-1_main.c b/gcc/testsuite/gcc.dg/compat/pr83487-1_main.c
new file mode 100644 (file)
index 0000000..cd7cd94
--- /dev/null
@@ -0,0 +1,8 @@
+extern void do_test (void);
+
+int
+main ()
+{
+  do_test ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-1_x.c b/gcc/testsuite/gcc.dg/compat/pr83487-1_x.c
new file mode 100644 (file)
index 0000000..043a4c4
--- /dev/null
@@ -0,0 +1,63 @@
+#include "pr83487-1.h"
+
+extern
+#ifdef __cplusplus
+"C"
+#endif
+void abort ();
+
+void
+f1 (int i, int j, int k, int l, int m, int n, int o, struct A x)
+{
+  if (i != 6 || j != 0 || k != 1 || l != 2 || m != 3 || n != 4 || o != 5)
+    abort ();
+}
+
+void
+f2 (int i, int j, int k, int l, int m, int n, int o, struct A x, int p, int q)
+{
+  if (i != 6 || j != 0 || k != 1 || l != 2 || m != 3 || n != 4 || o != 5 || p != 7 || q != 8)
+    abort ();
+}
+
+void
+f3 (int i, int j, int k, int l, int m, int n, int o, struct B x, int p, int q)
+{
+  if (i != 6 || j != 0 || k != 1 || l != 2 || m != 3 || n != 4 || o != 5 || p != 7 || q != 8)
+    abort ();
+}
+
+void
+f4 (int i, int j, int k, int l, int m, int n, int o, struct C x, int p, int q)
+{
+  if (i != 6 || j != 0 || k != 1 || l != 2 || m != 3 || n != 4 || o != 5 || p != 7 || q != 8)
+    abort ();
+}
+
+void
+f5 (int o, struct A x)
+{
+  if (o != 5)
+    abort ();
+}
+
+void
+f6 (int o, struct A x, int p, int q)
+{
+  if (o != 5 || p != 7 || q != 8)
+    abort ();
+}
+
+void
+f7 (int o, struct B x, int p, int q)
+{
+  if (o != 5 || p != 7 || q != 8)
+    abort ();
+}
+
+void
+f8 (int o, struct C x, int p, int q)
+{
+  if (o != 5 || p != 7 || q != 8)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-1_y.c b/gcc/testsuite/gcc.dg/compat/pr83487-1_y.c
new file mode 100644 (file)
index 0000000..ef927bb
--- /dev/null
@@ -0,0 +1,27 @@
+#include "pr83487-1.h"
+
+struct A a;
+struct B b;
+struct C c;
+
+extern void f1 (int i, int j, int k, int l, int m, int n, int o, struct A);
+extern void f2 (int i, int j, int k, int l, int m, int n, int o, struct A, int p, int q);
+extern void f3 (int i, int j, int k, int l, int m, int n, int o, struct B, int p, int q);
+extern void f4 (int i, int j, int k, int l, int m, int n, int o, struct C, int p, int q);
+extern void f5 (int o, struct A);
+extern void f6 (int o, struct A, int p, int q);
+extern void f7 (int o, struct B, int p, int q);
+extern void f8 (int o, struct C, int p, int q);
+
+void
+do_test ()
+{
+  f1 (6, 0, 1, 2, 3, 4, 5, a);
+  f2 (6, 0, 1, 2, 3, 4, 5, a, 7, 8);
+  f3 (6, 0, 1, 2, 3, 4, 5, b, 7, 8);
+  f4 (6, 0, 1, 2, 3, 4, 5, c, 7, 8);
+  f5 (5, a);
+  f6 (5, a, 7, 8);
+  f7 (5, b, 7, 8);
+  f8 (5, c, 7, 8);
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-2_main.c b/gcc/testsuite/gcc.dg/compat/pr83487-2_main.c
new file mode 100644 (file)
index 0000000..276ae3b
--- /dev/null
@@ -0,0 +1 @@
+#include "pr83487-1_main.c"
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-2_x.c b/gcc/testsuite/gcc.dg/compat/pr83487-2_x.c
new file mode 100644 (file)
index 0000000..494abd7
--- /dev/null
@@ -0,0 +1,2 @@
+#define PR83487_LARGE
+#include "pr83487-1_x.c"
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-2_y.c b/gcc/testsuite/gcc.dg/compat/pr83487-2_y.c
new file mode 100644 (file)
index 0000000..e5a67d5
--- /dev/null
@@ -0,0 +1,2 @@
+#define PR83487_LARGE
+#include "pr83487-1_y.c"