This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH RFC 1/3] Hookize PROMOTE_FUNCTION_MODE with provision for ARM HFmode


On 08/02/2009 04:09 AM, H.J. Lu wrote:
On Tue, Apr 21, 2009 at 6:04 AM, Paolo Bonzini<bonzini@gnu.org> wrote:
The aim of this series is to cleanup uses of promote_mode and to
turn all three hooks PROMOTE_FUNCTION_MODE, TARGET_PROMOTE_FUNCTION_RETURN
and TARGET_PROMOTE_FUNCTION_ARGS into a single hook.  This, among other
things, should make it simpler to distinguish the passing of HFmode
values for libcalls and ordinary functions for the ARM.

This first part introduces two new functions.  One is promote_function_mode,
a low-level function whose semantics and signature are the same as the
intended target hook.

The second is promote_decl_mode, which wraps the low-level promote_mode
and promote_function_mode so that it can be used most of the time.

Overall, the series does not succeed in deleting more lines than it adds :-)
but the result is strictly more powerful, as it allows tweaking the
promotions *per argument and per function*.  Right now, if a function
does not want to promote something, it cannot promoting everything.

The patch is being bootstrapped right now on i686-pc-linux-gnu; I
have already built the relevant targets.

Paolo

2009-04-17 Paolo Bonzini<bonzini@gnu.org>

        * expr.c (store_constructor): Use promote_decl_mode.  Remove
        now write-only variable unsignedp.
        (expand_expr_real_1): Use promote_decl_mode.
        * expr.h (promote_function_mode, promote_decl_mode): New.
        (promote_mode): Remove last argument.
        * function.c (assign_temp): Drop last argument of promote_mode.
        (assign_parm_find_data_types): Use promote_function_mode.
        (assign_parm_setup_reg): Likewise.
        (expand_function_end): Use promote_function_mode.
        * calls.c (initialize_argument_information): Use promote_function_mode.
        (precompute_arguments): Use promote_mode instead of checking if
        only PROMOTE_FUNCTION_MODE is defined.
        (expand_call): When making sibcall decisions, use promote_function_mode.
        Below, remove an if for targetm.calls.promote_function_return and
        and use promote_function_mode.
        (emit_library_call_value_1): Use promote_function_mode, fix bug
        where promote_mode was passed FOR_CALL == 0 for a return value in an
        assertion.
        * cfgexpand.c (expand_one_register_var): Use promote_decl_mode.
        * explow.c (promote_function_mode, promote_decl_mode): New.
        (promote_mode): Keep only the FOR_CALL == 0 case.
        * combine.c (setup_incoming_promotion): Remove test of
        promote_function_args.  Use promote_function_mode.
        * stmt.c (expand_value_return): Use promote_decl_mode.
        (expand_decl): Use promote_decl_mode.


This series of patches caused:


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40937

I removed this assertion which was not meant to be committed.


Index: explow.c
===================================================================
--- explow.c	(revision 150336)
+++ explow.c	(working copy)
@@ -761,5 +761,4 @@ promote_function_mode (const_tree type,
 		       const_tree funtype, int for_return)
 {
-  gcc_assert (GET_MODE_CLASS (mode) != MODE_COMPLEX_INT);
   switch (TREE_CODE (type))
     {

2009-08-02 Paolo Bonzini <bonzini@gnu.org

* explow.c (promote_function_mode): Remove assert.

Paolo


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]