aboutsummaryrefslogtreecommitdiff
path: root/gcc/explow.c
diff options
context:
space:
mode:
authorGlen Nakamura <glen@imodulo.com>2003-04-07 22:57:41 +0000
committerRichard Henderson <rth@gcc.gnu.org>2003-04-07 15:57:41 -0700
commitb0a3412c466ef89b925f4754f27b5b0af9d82989 (patch)
tree5c9af0f6f2b13994e8a18e00191c5bf0c49f5ad6 /gcc/explow.c
parentc5a1e3d69af23fefe755f18ece4d76542766aa46 (diff)
downloadgcc-b0a3412c466ef89b925f4754f27b5b0af9d82989.zip
gcc-b0a3412c466ef89b925f4754f27b5b0af9d82989.tar.gz
gcc-b0a3412c466ef89b925f4754f27b5b0af9d82989.tar.bz2
re PR rtl-optimization/8634 (incorrect code for inlining of memcpy under -O2)
PR opt/8634 * explow.c (maybe_set_unchanging): Don't flag non-static const aggregate type initializers with RTX_UNCHANGING_P. From-SVN: r65352
Diffstat (limited to 'gcc/explow.c')
-rw-r--r--gcc/explow.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/explow.c b/gcc/explow.c
index 50556e8..9ed034e 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -657,8 +657,18 @@ maybe_set_unchanging (ref, t)
/* We can set RTX_UNCHANGING_P from TREE_READONLY for decls whose
initialization is only executed once, or whose initializer always
has the same value. Currently we simplify this to PARM_DECLs in the
- first case, and decls with TREE_CONSTANT initializers in the second. */
+ first case, and decls with TREE_CONSTANT initializers in the second.
+
+ We cannot do this for non-static aggregates, because of the double
+ writes that can be generated by store_constructor, depending on the
+ contents of the initializer. Yes, this does eliminate a good fraction
+ of the number of uses of RTX_UNCHANGING_P for a language like Ada.
+ It also eliminates a good quantity of bugs. Let this be incentive to
+ eliminate RTX_UNCHANGING_P entirely in favour of a more reliable
+ solution, perhaps based on alias sets. */
+
if ((TREE_READONLY (t) && DECL_P (t)
+ && (TREE_STATIC (t) || ! AGGREGATE_TYPE_P (TREE_TYPE (t)))
&& (TREE_CODE (t) == PARM_DECL
|| (DECL_INITIAL (t) && TREE_CONSTANT (DECL_INITIAL (t)))))
|| TREE_CODE_CLASS (TREE_CODE (t)) == 'c')