From 729bf8ab4a3f8e4e83266e249211e4304d5a542c Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Wed, 12 Nov 2003 02:10:12 +0000 Subject: [PATCH] function.c (purge_addressof_1): Add libcall check. 2003-11-11 Eric Christopher * 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 --- gcc/ChangeLog | 13 ++++++++++--- gcc/function.c | 47 ++++++++++++++++++++++++----------------------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 93dd845371f..f04aff9802a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-11-11 Eric Christopher + + * 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 * 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 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 * config/s390/s390.c (s390_emit_epilogue): Recognize more cases diff --git a/gcc/function.c b/gcc/function.c index 332310a94f5..ef1afaaa35a 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 -- 2.30.2