Check int_size_in_bytes in ix86_return_in_memory
authorH.J. Lu <hongjiu.lu@intel.com>
Thu, 9 Jul 2015 09:26:47 +0000 (09:26 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Thu, 9 Jul 2015 09:26:47 +0000 (02:26 -0700)
ix86_return_in_memory should check negative return from int_size_in_bytes,
similar to other ports.

gcc/

PR target/66817
* config/i386/i386.c (ix86_return_in_memory): Return true
if int_size_in_bytes returns negative for IA MCU.

gcc/testsuite/

PR target/66817
* gcc.target/i386/pr66817.c: New test.

From-SVN: r225605

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr66817.c [new file with mode: 0644]

index a0d835e1efde13bec4b9d1d1b71fe9eac3503645..78cc6f945532f0b3bb629fe2d5276e92fea1bf0b 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-09  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/66817
+       * config/i386/i386.c (ix86_return_in_memory): Return true
+       if int_size_in_bytes returns negative for IA MCU.
+
 2015-07-09  Marek Polacek  <polacek@redhat.com>
 
        PR tree-optimization/66718
index 55a32acc5814d2bca64fd1bcdafb880554019209..54ee6f3d4fdf9d622d9bc8363b9a49cf75301b32 100644 (file)
@@ -8682,7 +8682,7 @@ ix86_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
       /* Intel MCU psABI returns scalars and aggregates no larger than 8
         bytes in registers.  */
       if (TARGET_IAMCU)
-       return VECTOR_MODE_P (mode) || size > 8;
+       return VECTOR_MODE_P (mode) || size < 0 || size > 8;
 
       if (mode == BLKmode)
        return true;
index 661ccb52de186f80f2dee8076993fc0f71f90a6a..42b6203162324284a370bd54e1270f4a5b908192 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-09  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/66817
+       * gcc.target/i386/pr66817.c: New test.
+
 2015-07-09  Marek Polacek  <polacek@redhat.com>
 
        PR tree-optimization/66718
diff --git a/gcc/testsuite/gcc.target/i386/pr66817.c b/gcc/testsuite/gcc.target/i386/pr66817.c
new file mode 100644 (file)
index 0000000..7ec18b7
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile { target ia32 } } */
+/* { dg-options "-O2 -mno-sse -mno-mmx -miamcu" } */
+
+extern void abort (void);
+int
+main (int argc, char **argv)
+{
+  int size = 10;
+  typedef struct
+    {
+      char val[size];
+    }
+  block;
+  block a, b;
+  block __attribute__((noinline))
+  retframe_block ()
+    {
+      return *(block *) &b;
+    }
+  b.val[0] = 1;
+  b.val[9] = 2;
+  a=retframe_block ();
+  if (a.val[0] != 1
+      || a.val[9] != 2)
+    abort ();
+  return 0;
+}