summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-10 22:47:08 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-10 22:47:08 +0000
commitd217355ec70102e776f09159d3831277b729affd (patch)
tree2b1be739b500fee318e5f1d12833519be9204c09
parentd1c4137f842b4c9d9e363e50635be1b52c4ed4d9 (diff)
downloadppe42-gcc-d217355ec70102e776f09159d3831277b729affd.tar.gz
ppe42-gcc-d217355ec70102e776f09159d3831277b729affd.zip
PR c/26004
* gimplify.c (gimplify_modify_expr_rhs): Don't do return slot opt if the target was declared 'register'. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111947 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimplify.c3
-rw-r--r--gcc/testsuite/gcc.dg/pr26004.c11
3 files changed, 19 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8bb4a2af011..0d90fa2c091 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-03-10 Jason Merrill <jason@redhat.com>
+
+ PR c/26004
+ * gimplify.c (gimplify_modify_expr_rhs): Don't do return slot opt if
+ the target was declared 'register'.
+
2006-03-10 Adam Nemet <anemet@caviumnetworks.com>
* genpreds.c (write_insn_constraint_len): Change definition of
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 4b58201004d..c9498eef95a 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -3295,7 +3295,8 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
&& needs_to_live_in_memory (*to_p))
/* It's OK to use the return slot directly unless it's an NRV. */
use_target = true;
- else if (is_gimple_reg_type (TREE_TYPE (*to_p)))
+ else if (is_gimple_reg_type (TREE_TYPE (*to_p))
+ || (DECL_P (*to_p) && DECL_REGISTER (*to_p)))
/* Don't force regs into memory. */
use_target = false;
else if (TREE_CODE (*to_p) == VAR_DECL
diff --git a/gcc/testsuite/gcc.dg/pr26004.c b/gcc/testsuite/gcc.dg/pr26004.c
new file mode 100644
index 00000000000..35e6a2feb93
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr26004.c
@@ -0,0 +1,11 @@
+/* PR c/26004 */
+/* Bug: the return slot optimization was taking the address of s_3,
+ causing an error. */
+
+struct s_3 { short s[3]; } z_3, s_3;
+struct s_3 add_struct_3 (struct s_3 s){}
+wack_struct_3 (void)
+{
+ int i; register struct s_3 u = z_3;
+ u = add_struct_3 (u);
+}
OpenPOWER on IntegriCloud