From 49382b6cf985a8a8b586ff04ee035e824be6a048 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sun, 31 Oct 2004 04:17:40 -0500 Subject: [PATCH] re PR middle-end/17526 (libcpp is miscompiled with -fno-pcc-struct-return -O2) PR middle-end/17526 * tree-gimple.c (is_gimple_mem_rhs): Also require a val for aggregate types that are not BLKmode. From-SVN: r89915 --- gcc/ChangeLog | 6 ++++++ gcc/tree-gimple.c | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8fd5efb79f4..50f6cb269b1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-10-31 Jason Merrill + + PR middle-end/17526 + * tree-gimple.c (is_gimple_mem_rhs): Also require a val for + aggregate types that are not BLKmode. + 2004-10-30 Ziemowit Laski * c-common.h (objc_lookup_ivar): Add second parameter to diff --git a/gcc/tree-gimple.c b/gcc/tree-gimple.c index 84005aad409..4a31c0ee98c 100644 --- a/gcc/tree-gimple.c +++ b/gcc/tree-gimple.c @@ -111,9 +111,12 @@ is_gimple_reg_rhs (tree t) bool is_gimple_mem_rhs (tree t) { - /* If we're dealing with a renamable type, either source or dest - must be a renamed variable. */ - if (is_gimple_reg_type (TREE_TYPE (t))) + /* If we're dealing with a renamable type, either source or dest must be + a renamed variable. Also force a temporary if the type doesn't need + to be stored in memory, since it's cheap and prevents erroneous + tailcalls (PR 17526). */ + if (is_gimple_reg_type (TREE_TYPE (t)) + || TYPE_MODE (TREE_TYPE (t)) != BLKmode) return is_gimple_val (t); else return is_gimple_formal_tmp_rhs (t); -- 2.30.2