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
This commit is contained in:
Glen Nakamura 2003-04-07 22:57:41 +00:00 committed by Richard Henderson
parent c5a1e3d69a
commit b0a3412c46
2 changed files with 17 additions and 1 deletions

View File

@ -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

View File

@ -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')