aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2015-11-10 00:45:03 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2015-11-10 00:45:03 +0000
commitfbae25c0084e592c1e97fc0c8cf1650772d8c93a (patch)
treee102a1abb3a9716a05e485d07fc6c08fe10f2f01 /gcc
parent3a40d81dcd1bae2c8dea064cdd0f28c9269813da (diff)
downloadgcc-fbae25c0084e592c1e97fc0c8cf1650772d8c93a.zip
gcc-fbae25c0084e592c1e97fc0c8cf1650772d8c93a.tar.gz
gcc-fbae25c0084e592c1e97fc0c8cf1650772d8c93a.tar.bz2
re PR target/57845 (ICE with -freg-struct-return on SPARC)
PR target/57845 * config/sparc/sparc.c (sparc_function_value_1): In 32-bit mode, do not promote the mode for aggregate types. From-SVN: r230074
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/sparc/sparc.c5
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/sparc/sparc-ret-1.c (renamed from gcc/testsuite/gcc.target/sparc/sparc-ret.c)0
-rw-r--r--gcc/testsuite/gcc.target/sparc/sparc-ret-2.c13
5 files changed, 30 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bf78538..32c3155 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,9 +1,15 @@
+2015-11-09 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR target/57845
+ * config/sparc/sparc.c (sparc_function_value_1): In 32-bit mode, do
+ not promote the mode for aggregate types.
+
2015-11-09 Nathan Sidwell <nathan@codesourcery.com>
* omp-low.h (replace_oacc_fn_attrib, build_oacc_routine_dims): Declare.
* omp-low.c (build_oacc_routine_dims): New.
-2015-11-08 Michael Meissner <meissner@linux.vnet.ibm.com>
+2015-11-09 Michael Meissner <meissner@linux.vnet.ibm.com>
* config/rs6000/constraints.md (wF constraint): New constraints
for power9/toc fusion.
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 7fa702e..23f1125 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -7329,9 +7329,10 @@ sparc_function_value_1 (const_tree type, machine_mode mode,
mode = word_mode;
}
- /* We should only have pointer and integer types at this point. This must
- match sparc_promote_function_mode. */
+ /* We should only have pointer and integer types at this point, except with
+ -freg-struct-return. This must match sparc_promote_function_mode. */
else if (TARGET_ARCH32
+ && !(type && AGGREGATE_TYPE_P (type))
&& mclass == MODE_INT
&& GET_MODE_SIZE (mode) < UNITS_PER_WORD)
mode = word_mode;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2875f15..88e1f52 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,4 +1,10 @@
-2015-11-08 Michael Meissner <meissner@linux.vnet.ibm.com>
+2015-11-09 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.target/sparc/sparc-ret.c: Rename to...
+ * gcc.target/sparc/sparc-ret-1.c: ...this.
+ * gcc.target/sparc/sparc-ret-2.c: New test.
+
+2015-11-09 Michael Meissner <meissner@linux.vnet.ibm.com>
* lib/target-supports.exp (check_p8vector_hw_available): Split
long line.
diff --git a/gcc/testsuite/gcc.target/sparc/sparc-ret.c b/gcc/testsuite/gcc.target/sparc/sparc-ret-1.c
index 808e8a9..808e8a9 100644
--- a/gcc/testsuite/gcc.target/sparc/sparc-ret.c
+++ b/gcc/testsuite/gcc.target/sparc/sparc-ret-1.c
diff --git a/gcc/testsuite/gcc.target/sparc/sparc-ret-2.c b/gcc/testsuite/gcc.target/sparc/sparc-ret-2.c
new file mode 100644
index 0000000..536b9b7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sparc/sparc-ret-2.c
@@ -0,0 +1,13 @@
+/* PR target/57845 */
+
+/* { dg-do compile } */
+/* { dg-options "-freg-struct-return" } */
+
+struct S { short int i; };
+
+struct S foo (short int i)
+{
+ struct S s;
+ s.i = i;
+ return s;
+}