diff options
author | Eric Christopher <echristo@gcc.gnu.org> | 2003-11-12 02:10:12 +0000 |
---|---|---|
committer | Eric Christopher <echristo@gcc.gnu.org> | 2003-11-12 02:10:12 +0000 |
commit | 729bf8ab4a3f8e4e83266e249211e4304d5a542c (patch) | |
tree | 6386e5e6e67b165b8b733166df3eb5f0a3e1cc54 | |
parent | f24f58310584ba860fb7f7b47390f8afe6b9db03 (diff) | |
download | gcc-729bf8ab4a3f8e4e83266e249211e4304d5a542c.zip gcc-729bf8ab4a3f8e4e83266e249211e4304d5a542c.tar.gz gcc-729bf8ab4a3f8e4e83266e249211e4304d5a542c.tar.bz2 |
function.c (purge_addressof_1): Add libcall check.
2003-11-11 Eric Christopher <echristo@redhat.com>
* function.c (purge_addressof_1): Add libcall check.
Remove test for cached replacements on fallback case.
Simplify mode comparisons. Add libcall test for
paradoxical subregs.
From-SVN: r73479
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/function.c | 47 |
2 files changed, 34 insertions, 26 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 93dd845..f04aff9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-11-11 Eric Christopher <echristo@redhat.com> + + * function.c (purge_addressof_1): Add libcall check. + Remove test for cached replacements on fallback case. + Simplify mode comparisons. Add libcall test for + paradoxical subregs. + 2003-11-11 Kazu Hirata <kazu@cs.umass.edu> * config/h8300/t-h8300: Fix an obsolete comment. @@ -46,7 +53,7 @@ anything other than VISIBILITY_DEFAULT and VISIBILITY_HIDDEN. * config/darwin.h (TARGET_ASM_ASSEMBLE_VISIBILITY): Use darwin_assemble_visibility instead of default. - + 2003-11-10 Waldek Hebisch <hebisch@math.uni.wroc.pl> PR target/12865 @@ -186,10 +193,10 @@ (decl_visibility): Remove declaration. * varasm.c (maybe_assemble_visibility): Use DECL_VISIBILITY instead of decl_visibility. - (default_binds_local_p_1): Use DECL_VISIBILITY instead of + (default_binds_local_p_1): Use DECL_VISIBILITY instead of decl_visibility. (decl_visibility): Remove. - + 2003-11-06 Ulrich Weigand <uweigand@de.ibm.com> * config/s390/s390.c (s390_emit_epilogue): Recognize more cases diff --git a/gcc/function.c b/gcc/function.c index 332310a..ef1afaa 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2929,6 +2929,7 @@ purge_addressof_1 (rtx *loc, rtx insn, int force, int store, int may_postpone, int i, j; const char *fmt; bool result = true; + bool libcall = false; /* Re-start here to avoid recursion in common cases. */ restart: @@ -2937,6 +2938,10 @@ purge_addressof_1 (rtx *loc, rtx insn, int force, int store, int may_postpone, if (x == 0) return true; + /* Is this a libcall? */ + if (!insn) + libcall = REG_NOTE_KIND (*loc) == REG_RETVAL; + code = GET_CODE (x); /* If we don't return in any of the cases below, we will recurse inside @@ -3070,31 +3075,27 @@ purge_addressof_1 (rtx *loc, rtx insn, int force, int store, int may_postpone, which can be succinctly described with a simple SUBREG. Note that removing the REG_EQUAL note is not an option on the last insn of a libcall, so we must do a replacement. */ - if (! purge_addressof_replacements - && ! purge_bitfield_addressof_replacements) - { - /* In compile/990107-1.c:7 compiled at -O1 -m1 for sh-elf, - we got - (mem:DI (addressof:SI (reg/v:DF 160) 159 0x401c8510) - [0 S8 A32]), which can be expressed with a simple - same-size subreg */ - if ((GET_MODE_SIZE (GET_MODE (x)) - == GET_MODE_SIZE (GET_MODE (sub))) - /* Again, invalid pointer casts (as in - compile/990203-1.c) can require paradoxical - subregs. */ - || (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD - && (GET_MODE_SIZE (GET_MODE (x)) - > GET_MODE_SIZE (GET_MODE (sub)))) - || (GET_MODE_SIZE (GET_MODE (x)) - < GET_MODE_SIZE (GET_MODE (sub)))) - { - *loc = gen_rtx_SUBREG (GET_MODE (x), sub, 0); - return true; - } - /* ??? Are there other cases we should handle? */ + /* In compile/990107-1.c:7 compiled at -O1 -m1 for sh-elf, + we got + (mem:DI (addressof:SI (reg/v:DF 160) 159 0x401c8510) + [0 S8 A32]), which can be expressed with a simple + same-size subreg */ + if ((GET_MODE_SIZE (GET_MODE (x)) + <= GET_MODE_SIZE (GET_MODE (sub))) + /* Again, invalid pointer casts (as in + compile/990203-1.c) can require paradoxical + subregs. */ + || (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD + && (GET_MODE_SIZE (GET_MODE (x)) + > GET_MODE_SIZE (GET_MODE (sub))) + && libcall)) + { + *loc = gen_rtx_SUBREG (GET_MODE (x), sub, 0); + return true; } + /* ??? Are there other cases we should handle? */ + /* Sometimes we may not be able to find the replacement. For example when the original insn was a MEM in a wider mode, and the note is part of a sign extension of a narrowed |