diff options
author | Glen Nakamura <glen@imodulo.com> | 2003-04-07 22:57:41 +0000 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2003-04-07 15:57:41 -0700 |
commit | b0a3412c466ef89b925f4754f27b5b0af9d82989 (patch) | |
tree | 5c9af0f6f2b13994e8a18e00191c5bf0c49f5ad6 | |
parent | c5a1e3d69af23fefe755f18ece4d76542766aa46 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/explow.c | 12 |
2 files changed, 17 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b3cf656..ac37bd2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-04-07 Glen Nakamura <glen@imodulo.com> + + PR opt/8634 + * explow.c (maybe_set_unchanging): Don't flag non-static const + aggregate type initializers with RTX_UNCHANGING_P. + 2003-04-07 Richard Henderson <rth@redhat.com> PR opt/8634 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') |