Patchwork [middle-end] Add machine_mode to address_cost target hook

login
register
mail settings
Submitter Oleg Endo
Date Sept. 1, 2012, 1:20 p.m.
Message ID <1346505654.2200.25.camel@yam-132-YW-E178-FTW>
Download mbox | patch
Permalink /patch/181136/
State New
Headers show

Comments

Oleg Endo - Sept. 1, 2012, 1:20 p.m.
On Sat, 2012-09-01 at 10:10 +0100, Richard Sandiford wrote:

> Thanks for doing this.  We should perhaps add the address space too,
> but if you don't feel like redoing the whole patch, that can wait until
> someone wants it.

I just had a look at the address space thing...
There are already target hook overloads with address space parameters,
like legitimate_address_p and legitimize_address.  Paolo suggested to do
something similar a while ago:
http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01191.html

.. but somehow this never made it into mainline?!

Maybe it would be better to ...
a) Add an 'address_cost' overload to the existing onces.
   (at least it would be consistent...)
b) Remove the overloads altogether and add the address space arg to the
original funcs.

Personally, I'd probably favor b).  Some targets (e.g. rl78) already
override the address space overloads and just ignore the address space
arg.  Either way, maybe it's better to do it in a separate patch.  This
looks a bit like a pandora's box :)

> >  /* If the target doesn't override, compute the cost as with arithmetic.  */
> >  
> >  int
> > -default_address_cost (rtx x, bool speed)
> > +default_address_cost (rtx x, enum machine_mode mode, bool speed)
> >  {
> >    return rtx_cost (x, MEM, 0, speed);
> >  }
> 
> Remove the "mode" parameter name because it's unused.  I think this
> would trigger a warning otherwise.

Removing won't do here, because of:

Instead I've added ATTRIBUTE_UNUSED to avoid the warning.

> Please change this to:
> 
> static int
> mips_address_cost (rtx addr, enum machine_mode mode,
> 		   bool speed ATTRIBUTE_UNUSED)
> {
>   return mips_address_insns (addr, mode, false);
> }
> 
> MIPS is one of those targets that wanted to know the mode all along.
> 

OK, done.  Updated patch attached.

ACK status of the whole thing so far is below.
Somebody please check all the boxes :)

[x] target-independent bits
[ ] alpha     [ ] arm       [ ] avr         [ ] bfin
[ ] cr16      [ ] cris      [ ] epiphany    [ ] i386
[ ] ia64      [ ] iq2000    [ ] lm32        [ ] m32c
[ ] m32r      [ ] mcore     [ ] mep         [x] microblaze
[x] mips      [ ] mmix      [x] mn10300     [ ] pa
[ ] rs6000    [ ] rx        [ ] s390        [ ] score
[x] sh        [ ] sparc     [ ] spu         [ ] stormy16
[ ] v850      [ ] vax       [ ] xtensa

Cheers,
Oleg
Richard Sandiford - Sept. 2, 2012, 8:15 a.m.
Oleg Endo <oleg.endo@t-online.de> writes:
> On Sat, 2012-09-01 at 10:10 +0100, Richard Sandiford wrote:
>
>> Thanks for doing this.  We should perhaps add the address space too,
>> but if you don't feel like redoing the whole patch, that can wait until
>> someone wants it.
>
> I just had a look at the address space thing...
> There are already target hook overloads with address space parameters,
> like legitimate_address_p and legitimize_address.  Paolo suggested to do
> something similar a while ago:
> http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01191.html
>
> .. but somehow this never made it into mainline?!
>
> Maybe it would be better to ...
> a) Add an 'address_cost' overload to the existing onces.
>    (at least it would be consistent...)
> b) Remove the overloads altogether and add the address space arg to the
> original funcs.
>
> Personally, I'd probably favor b).  Some targets (e.g. rl78) already
> override the address space overloads and just ignore the address space
> arg.  Either way, maybe it's better to do it in a separate patch.  This
> looks a bit like a pandora's box :)

Well, I certainly wasn't suggesting you had to do anything with
overloaded hooks (which I agree are unfortunate).  It's just that
rtlanal.c:address_cost already gets an address space argument, so if
we're going through all the ports adding the mode argument to the hook,
it seemed a pity not to add the address space argument at the same time.

I don't see anything wrong with adding address space arguments to hooks
outside the addr_space substructure.

But like I say, I won't insist.

>> >  /* If the target doesn't override, compute the cost as with arithmetic.  */
>> >  
>> >  int
>> > -default_address_cost (rtx x, bool speed)
>> > +default_address_cost (rtx x, enum machine_mode mode, bool speed)
>> >  {
>> >    return rtx_cost (x, MEM, 0, speed);
>> >  }
>> 
>> Remove the "mode" parameter name because it's unused.  I think this
>> would trigger a warning otherwise.
>
> Removing won't do here, because of:
>
> Index: gcc/target.def
> ===================================================================
> --- gcc/target.def	(revision 190840)
> +++ gcc/target.def	(working copy)
> @@ -1758,7 +1758,7 @@
>  DEFHOOK
>  (address_cost,
>   "",
> - int, (rtx address, bool speed),
> + int, (rtx address, enum machine_mode mode, bool speed),
>   default_address_cost)
>
>
> Instead I've added ATTRIBUTE_UNUSED to avoid the warning.

Note that I said remove the "mode" parameter _name_, not the parameter
itself :-)  We're C++ now, so leaving out the name is better than
supplying an unused one and then adding ATTRIBUTE_UNUSED to it.

Richard
Georg-Johann Lay - Sept. 2, 2012, 10:32 a.m.
Richard Sandiford schrieb:
> Oleg Endo <oleg.endo@t-online.de> writes:
>> On Sat, 2012-09-01 at 10:10 +0100, Richard Sandiford wrote:
>>
>>> Thanks for doing this.  We should perhaps add the address space too,
>>> but if you don't feel like redoing the whole patch, that can wait until
>>> someone wants it.
>> I just had a look at the address space thing...
>> There are already target hook overloads with address space parameters,
>> like legitimate_address_p and legitimize_address.  Paolo suggested to do
>> something similar a while ago:
>> http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01191.html
>>
>> .. but somehow this never made it into mainline?!
>>
>> Maybe it would be better to ...
>> a) Add an 'address_cost' overload to the existing onces.
>>    (at least it would be consistent...)
>> b) Remove the overloads altogether and add the address space arg to the
>> original funcs.
>>
>> Personally, I'd probably favor b).  Some targets (e.g. rl78) already
>> override the address space overloads and just ignore the address space
>> arg.  Either way, maybe it's better to do it in a separate patch.  This
>> looks a bit like a pandora's box :)
> 
> Well, I certainly wasn't suggesting you had to do anything with
> overloaded hooks (which I agree are unfortunate).  It's just that
> rtlanal.c:address_cost already gets an address space argument, so if
> we're going through all the ports adding the mode argument to the hook,
> it seemed a pity not to add the address space argument at the same time.

Agreed.

It's not possible to determine the costs from the address and the mode
alone, cf. HImode and the address spaces of the avr port for example.

Costs are very different depending no the address space and strangely
the address space isnot part of the address but only of the surrounding
mem...

Johann


> I don't see anything wrong with adding address space arguments to hooks
> outside the addr_space substructure.
> 
> But like I say, I won't insist.
> 
>>>>  /* If the target doesn't override, compute the cost as with arithmetic.  */
>>>>  
>>>>  int
>>>> -default_address_cost (rtx x, bool speed)
>>>> +default_address_cost (rtx x, enum machine_mode mode, bool speed)
>>>>  {
>>>>    return rtx_cost (x, MEM, 0, speed);
>>>>  }
>>> Remove the "mode" parameter name because it's unused.  I think this
>>> would trigger a warning otherwise.
>> Removing won't do here, because of:
>>
>> Index: gcc/target.def
>> ===================================================================
>> --- gcc/target.def	(revision 190840)
>> +++ gcc/target.def	(working copy)
>> @@ -1758,7 +1758,7 @@
>>  DEFHOOK
>>  (address_cost,
>>   "",
>> - int, (rtx address, bool speed),
>> + int, (rtx address, enum machine_mode mode, bool speed),
>>   default_address_cost)
>>
>>
>> Instead I've added ATTRIBUTE_UNUSED to avoid the warning.
> 
> Note that I said remove the "mode" parameter _name_, not the parameter
> itself :-)  We're C++ now, so leaving out the name is better than
> supplying an unused one and then adding ATTRIBUTE_UNUSED to it.
> 
> Richard
>
Oleg Endo - Sept. 2, 2012, 11:58 p.m.
On Sun, 2012-09-02 at 12:32 +0200, Georg-Johann Lay wrote:
> Richard Sandiford schrieb:
> > Oleg Endo <oleg.endo@t-online.de> writes:
> >> On Sat, 2012-09-01 at 10:10 +0100, Richard Sandiford wrote:
> >>
> >>> Thanks for doing this.  We should perhaps add the address space too,
> >>> but if you don't feel like redoing the whole patch, that can wait until
> >>> someone wants it.
> >> I just had a look at the address space thing...
> >> There are already target hook overloads with address space parameters,
> >> like legitimate_address_p and legitimize_address.  Paolo suggested to do
> >> something similar a while ago:
> >> http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01191.html
> >>
> >> .. but somehow this never made it into mainline?!
> >>
> >> Maybe it would be better to ...
> >> a) Add an 'address_cost' overload to the existing onces.
> >>    (at least it would be consistent...)
> >> b) Remove the overloads altogether and add the address space arg to the
> >> original funcs.
> >>
> >> Personally, I'd probably favor b).  Some targets (e.g. rl78) already
> >> override the address space overloads and just ignore the address space
> >> arg.  Either way, maybe it's better to do it in a separate patch.  This
> >> looks a bit like a pandora's box :)
> > 
> > Well, I certainly wasn't suggesting you had to do anything with
> > overloaded hooks (which I agree are unfortunate).  It's just that
> > rtlanal.c:address_cost already gets an address space argument, so if
> > we're going through all the ports adding the mode argument to the hook,
> > it seemed a pity not to add the address space argument at the same time.
> 
> Agreed.
> 
> It's not possible to determine the costs from the address and the mode
> alone, cf. HImode and the address spaces of the avr port for example.
> 
> Costs are very different depending no the address space and strangely
> the address space isnot part of the address but only of the surrounding
> mem...

OKOK -- I'll do it :)
(within the next couple of days)

Cheers,
Oleg

Patch

Index: gcc/rtlanal.c
===================================================================
--- gcc/rtlanal.c	(revision 190840)
+++ gcc/rtlanal.c	(working copy)
@@ -3820,13 +3820,14 @@ 
   if (!memory_address_addr_space_p (mode, x, as))
     return 1000;
 
-  return targetm.address_cost (x, speed);
+  return targetm.address_cost (x, mode, speed);
 }
 
 /* If the target doesn't override, compute the cost as with arithmetic.  */
 
 int
-default_address_cost (rtx x, bool speed)
+default_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
+		      bool speed)
 {
   return rtx_cost (x, MEM, 0, speed);
 }
Index: gcc/output.h
===================================================================
--- gcc/output.h	(revision 190840)
+++ gcc/output.h	(working copy)
@@ -606,7 +606,7 @@ 
 extern void default_elf_fini_array_asm_out_destructor (rtx, int);
 extern int maybe_assemble_visibility (tree);
 
-extern int default_address_cost (rtx, bool);
+extern int default_address_cost (rtx, enum machine_mode, bool);
 
 /* Output stack usage information.  */
 extern void output_stack_usage (void);
Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi	(revision 190840)
+++ gcc/doc/tm.texi	(working copy)
@@ -6440,7 +6440,7 @@ 
 processed, and false when @code{rtx_cost} should recurse.
 @end deftypefn
 
-@deftypefn {Target Hook} int TARGET_ADDRESS_COST (rtx @var{address}, bool @var{speed})
+@deftypefn {Target Hook} int TARGET_ADDRESS_COST (rtx @var{address}, enum machine_mode @var{mode}, bool @var{speed})
 This hook computes the cost of an addressing mode that contains
 @var{address}.  If not defined, the cost is computed from
 the @var{address} expression and the @code{TARGET_RTX_COST} hook.
Index: gcc/target.def
===================================================================
--- gcc/target.def	(revision 190840)
+++ gcc/target.def	(working copy)
@@ -1758,7 +1758,7 @@ 
 DEFHOOK
 (address_cost,
  "",
- int, (rtx address, bool speed),
+ int, (rtx address, enum machine_mode mode, bool speed),
  default_address_cost)
 
 /* Return where to allocate pseudo for a given hard register initial value.  */
Index: gcc/hooks.c
===================================================================
--- gcc/hooks.c	(revision 190840)
+++ gcc/hooks.c	(working copy)
@@ -200,6 +200,14 @@ 
   return 0;
 }
 
+int
+hook_int_rtx_mode_bool_0 (rtx a ATTRIBUTE_UNUSED,
+			  enum machine_mode b ATTRIBUTE_UNUSED,
+			  bool c ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
 unsigned int
 hook_uint_void_0 (void)
 {
Index: gcc/hooks.h
===================================================================
--- gcc/hooks.h	(revision 190840)
+++ gcc/hooks.h	(working copy)
@@ -74,6 +74,7 @@ 
 extern int hook_int_const_tree_const_tree_1 (const_tree, const_tree);
 extern int hook_int_rtx_0 (rtx);
 extern int hook_int_rtx_bool_0 (rtx, bool);
+extern int hook_int_rtx_mode_bool_0 (rtx, enum machine_mode, bool);
 
 extern tree hook_tree_const_tree_null (const_tree);
 
Index: gcc/config/s390/s390.c
===================================================================
--- gcc/config/s390/s390.c	(revision 190840)
+++ gcc/config/s390/s390.c	(working copy)
@@ -2597,7 +2597,8 @@ 
 /* Return the cost of an address rtx ADDR.  */
 
 static int
-s390_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
+s390_address_cost (rtx addr, enum machine_mode mode ATTRIBUTE_UNUSED,
+		   bool speed ATTRIBUTE_UNUSED)
 {
   struct s390_address ad;
   if (!s390_decompose_address (addr, &ad))
Index: gcc/config/m32c/m32c.c
===================================================================
--- gcc/config/m32c/m32c.c	(revision 190840)
+++ gcc/config/m32c/m32c.c	(working copy)
@@ -2278,7 +2278,8 @@ 
 #undef TARGET_ADDRESS_COST
 #define TARGET_ADDRESS_COST m32c_address_cost
 static int
-m32c_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
+m32c_address_cost (rtx addr, enum machine_mode mode ATTRIBUTE_UNUSED,
+		   bool speed ATTRIBUTE_UNUSED)
 {
   int i;
   /*  fprintf(stderr, "\naddress_cost\n");
Index: gcc/config/m32r/m32r.c
===================================================================
--- gcc/config/m32r/m32r.c	(revision 190840)
+++ gcc/config/m32r/m32r.c	(working copy)
@@ -161,7 +161,7 @@ 
 #undef  TARGET_RTX_COSTS
 #define TARGET_RTX_COSTS m32r_rtx_costs
 #undef  TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST hook_int_rtx_mode_bool_0
 
 #undef  TARGET_PROMOTE_PROTOTYPES
 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c	(revision 190840)
+++ gcc/config/i386/i386.c	(working copy)
@@ -11955,7 +11955,8 @@ 
    requires to two regs - that would mean more pseudos with longer
    lifetimes.  */
 static int
-ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
+ix86_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
+		   bool speed ATTRIBUTE_UNUSED)
 {
   struct ix86_address parts;
   int cost = 1;
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 190840)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -928,7 +928,7 @@ 
 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
 static int rs6000_memory_move_cost (enum machine_mode, reg_class_t, bool);
 static bool rs6000_debug_rtx_costs (rtx, int, int, int, int *, bool);
-static int rs6000_debug_address_cost (rtx, bool);
+static int rs6000_debug_address_cost (rtx, enum machine_mode, bool);
 static int rs6000_debug_adjust_cost (rtx, rtx, rtx, int);
 static bool is_microcoded_insn (rtx);
 static bool is_nonpipeline_insn (rtx);
@@ -1294,7 +1294,7 @@ 
 #undef TARGET_RTX_COSTS
 #define TARGET_RTX_COSTS rs6000_rtx_costs
 #undef TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST hook_int_rtx_mode_bool_0
 
 #undef TARGET_DWARF_REGISTER_SPAN
 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
@@ -26070,12 +26070,13 @@ 
 /* Debug form of ADDRESS_COST that is selected if -mdebug=cost.  */
 
 static int
-rs6000_debug_address_cost (rtx x, bool speed)
+rs6000_debug_address_cost (rtx x, enum machine_mode mode, bool speed)
 {
   int ret = TARGET_ADDRESS_COST (x, speed);
 
-  fprintf (stderr, "\nrs6000_address_cost, return = %d, speed = %s, x:\n",
-	   ret, speed ? "true" : "false");
+  fprintf (stderr,
+	   "\nrs6000_address_cost, return = %d, mode = %s, speed = %s, x:\n",
+	   ret, GET_MODE_NAME (mode), speed ? "true" : "false");
   debug_rtx (x);
 
   return ret;
Index: gcc/config/alpha/alpha.c
===================================================================
--- gcc/config/alpha/alpha.c	(revision 190840)
+++ gcc/config/alpha/alpha.c	(working copy)
@@ -9795,7 +9795,7 @@ 
 #undef TARGET_RTX_COSTS
 #define TARGET_RTX_COSTS alpha_rtx_costs
 #undef TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST hook_int_rtx_mode_bool_0
 
 #undef TARGET_MACHINE_DEPENDENT_REORG
 #define TARGET_MACHINE_DEPENDENT_REORG alpha_reorg
Index: gcc/config/mn10300/mn10300.c
===================================================================
--- gcc/config/mn10300/mn10300.c	(revision 190840)
+++ gcc/config/mn10300/mn10300.c	(working copy)
@@ -2142,7 +2142,8 @@ 
    with an address register.  */
 
 static int
-mn10300_address_cost (rtx x, bool speed)
+mn10300_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
+		      bool speed)
 {
   HOST_WIDE_INT i;
   rtx base, index;
@@ -2457,7 +2458,7 @@ 
       break;
 
     case MEM:
-      total = mn10300_address_cost (XEXP (x, 0), speed);
+      total = mn10300_address_cost (XEXP (x, 0), GET_MODE (x), speed);
       if (speed)
 	total = COSTS_N_INSNS (2 + total);
       goto alldone;
Index: gcc/config/pa/pa.c
===================================================================
--- gcc/config/pa/pa.c	(revision 190840)
+++ gcc/config/pa/pa.c	(working copy)
@@ -91,7 +91,7 @@ 
 static void fix_range (const char *);
 static int hppa_register_move_cost (enum machine_mode mode, reg_class_t,
 				    reg_class_t);
-static int hppa_address_cost (rtx, bool);
+static int hppa_address_cost (rtx, enum machine_mode mode, bool);
 static bool hppa_rtx_costs (rtx, int, int, int, int *, bool);
 static inline rtx force_mode (enum machine_mode, rtx);
 static void pa_reorg (void);
@@ -1397,7 +1397,7 @@ 
    as GO_IF_LEGITIMATE_ADDRESS.  */
 
 static int
-hppa_address_cost (rtx X,
+hppa_address_cost (rtx X, enum machine_mode mode ATTRIBUTE_UNUSED,
 		   bool speed ATTRIBUTE_UNUSED)
 {
   switch (GET_CODE (X))
Index: gcc/config/stormy16/stormy16.c
===================================================================
--- gcc/config/stormy16/stormy16.c	(revision 190840)
+++ gcc/config/stormy16/stormy16.c	(working copy)
@@ -58,7 +58,7 @@ 
 static void xstormy16_init_builtins (void);
 static rtx xstormy16_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
 static bool xstormy16_rtx_costs (rtx, int, int, int, int *, bool);
-static int xstormy16_address_cost (rtx, bool);
+static int xstormy16_address_cost (rtx, enum machine_mode, bool);
 static bool xstormy16_return_in_memory (const_tree, const_tree);
 
 static GTY(()) section *bss100_section;
@@ -103,7 +103,8 @@ 
 }
 
 static int
-xstormy16_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
+xstormy16_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
+			bool speed ATTRIBUTE_UNUSED)
 {
   return (CONST_INT_P (x) ? 2
 	  : GET_CODE (x) == PLUS ? 7
Index: gcc/config/sparc/sparc.c
===================================================================
--- gcc/config/sparc/sparc.c	(revision 190840)
+++ gcc/config/sparc/sparc.c	(working copy)
@@ -689,7 +689,7 @@ 
 #undef TARGET_RTX_COSTS
 #define TARGET_RTX_COSTS sparc_rtx_costs
 #undef TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST hook_int_rtx_mode_bool_0
 #undef TARGET_REGISTER_MOVE_COST
 #define TARGET_REGISTER_MOVE_COST sparc_register_move_cost
 
Index: gcc/config/lm32/lm32.c
===================================================================
--- gcc/config/lm32/lm32.c	(revision 190840)
+++ gcc/config/lm32/lm32.c	(working copy)
@@ -86,7 +86,7 @@ 
 #undef TARGET_OPTION_OVERRIDE
 #define TARGET_OPTION_OVERRIDE lm32_option_override
 #undef TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST hook_int_rtx_mode_bool_0
 #undef TARGET_RTX_COSTS
 #define TARGET_RTX_COSTS lm32_rtx_costs
 #undef TARGET_IN_SMALL_DATA_P
Index: gcc/config/epiphany/epiphany.c
===================================================================
--- gcc/config/epiphany/epiphany.c	(revision 190840)
+++ gcc/config/epiphany/epiphany.c	(working copy)
@@ -729,7 +729,8 @@ 
    If ADDR is not a valid address, its cost is irrelevant.  */
 
 static int
-epiphany_address_cost (rtx addr, bool speed)
+epiphany_address_cost (rtx addr, enum machine_mode mode ATTRIBUTE_UNUSED,
+		       bool speed)
 {
   rtx reg;
   rtx off = const0_rtx;
Index: gcc/config/cris/cris.c
===================================================================
--- gcc/config/cris/cris.c	(revision 190840)
+++ gcc/config/cris/cris.c	(working copy)
@@ -130,7 +130,7 @@ 
 static int cris_register_move_cost (enum machine_mode, reg_class_t, reg_class_t);
 static int cris_memory_move_cost (enum machine_mode, reg_class_t, bool);
 static bool cris_rtx_costs (rtx, int, int, int, int *, bool);
-static int cris_address_cost (rtx, bool);
+static int cris_address_cost (rtx, enum machine_mode, bool);
 static bool cris_pass_by_reference (cumulative_args_t, enum machine_mode,
 				    const_tree, bool);
 static int cris_arg_partial_bytes (cumulative_args_t, enum machine_mode,
@@ -2149,7 +2149,8 @@ 
 /* The ADDRESS_COST worker.  */
 
 static int
-cris_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
+cris_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
+		   bool speed ATTRIBUTE_UNUSED)
 {
   /* The metric to use for the cost-macros is unclear.
      The metric used here is (the number of cycles needed) / 2,
Index: gcc/config/arm/arm.c
===================================================================
--- gcc/config/arm/arm.c	(revision 190840)
+++ gcc/config/arm/arm.c	(working copy)
@@ -162,7 +162,7 @@ 
 static bool arm_xscale_rtx_costs (rtx, enum rtx_code, enum rtx_code, int *, bool);
 static bool arm_9e_rtx_costs (rtx, enum rtx_code, enum rtx_code, int *, bool);
 static bool arm_rtx_costs (rtx, int, int, int, int *, bool);
-static int arm_address_cost (rtx, bool);
+static int arm_address_cost (rtx, enum machine_mode, bool);
 static int arm_register_move_cost (enum machine_mode, reg_class_t, reg_class_t);
 static int arm_memory_move_cost (enum machine_mode, reg_class_t, bool);
 static void arm_init_builtins (void);
@@ -8411,7 +8411,8 @@ 
 }
 
 static int
-arm_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
+arm_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
+		  bool speed ATTRIBUTE_UNUSED)
 {
   return TARGET_32BIT ? arm_arm_address_cost (x) : arm_thumb_address_cost (x);
 }
Index: gcc/config/ia64/ia64.c
===================================================================
--- gcc/config/ia64/ia64.c	(revision 190840)
+++ gcc/config/ia64/ia64.c	(working copy)
@@ -524,7 +524,7 @@ 
 #undef TARGET_RTX_COSTS
 #define TARGET_RTX_COSTS ia64_rtx_costs
 #undef TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST hook_int_rtx_mode_bool_0
 
 #undef TARGET_UNSPEC_MAY_TRAP_P
 #define TARGET_UNSPEC_MAY_TRAP_P ia64_unspec_may_trap_p
Index: gcc/config/rx/rx.c
===================================================================
--- gcc/config/rx/rx.c	(revision 190840)
+++ gcc/config/rx/rx.c	(working copy)
@@ -2724,7 +2724,7 @@ 
 }
 
 static int
-rx_address_cost (rtx addr, bool speed)
+rx_address_cost (rtx addr, enum machine_mode mode ATTRIBUTE_UNUSED, bool speed)
 {
   rtx a, b;
 
Index: gcc/config/vax/vax.c
===================================================================
--- gcc/config/vax/vax.c	(revision 190840)
+++ gcc/config/vax/vax.c	(working copy)
@@ -53,7 +53,7 @@ 
 static void vax_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
 				 HOST_WIDE_INT, tree);
 static int vax_address_cost_1 (rtx);
-static int vax_address_cost (rtx, bool);
+static int vax_address_cost (rtx, enum machine_mode, bool);
 static bool vax_rtx_costs (rtx, int, int, int, int *, bool);
 static rtx vax_function_arg (cumulative_args_t, enum machine_mode,
 			     const_tree, bool);
@@ -738,7 +738,8 @@ 
 }
 
 static int
-vax_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
+vax_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
+		  bool speed ATTRIBUTE_UNUSED)
 {
   return (1 + (REG_P (x) ? 0 : vax_address_cost_1 (x)));
 }
Index: gcc/config/sh/sh.c
===================================================================
--- gcc/config/sh/sh.c	(revision 190840)
+++ gcc/config/sh/sh.c	(working copy)
@@ -248,7 +248,7 @@ 
 static bool unspec_caller_rtx_p (rtx);
 static bool sh_cannot_copy_insn_p (rtx);
 static bool sh_rtx_costs (rtx, int, int, int, int *, bool);
-static int sh_address_cost (rtx, bool);
+static int sh_address_cost (rtx, enum machine_mode, bool);
 static int sh_pr_n_sets (void);
 static rtx sh_allocate_initial_value (rtx);
 static reg_class_t sh_preferred_reload_class (rtx, reg_class_t);
@@ -3368,7 +3368,8 @@ 
 /* Compute the cost of an address.  */
 
 static int
-sh_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
+sh_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
+		 bool speed ATTRIBUTE_UNUSED)
 {
   /* 'reg + disp' addressing.  */
   if (satisfies_constraint_Sdd (x))
Index: gcc/config/microblaze/microblaze.c
===================================================================
--- gcc/config/microblaze/microblaze.c	(revision 190840)
+++ gcc/config/microblaze/microblaze.c	(working copy)
@@ -1043,7 +1043,8 @@ 
 /* Provide the costs of an addressing mode that contains ADDR.
    If ADDR is not a valid address, its cost is irrelevant.  */
 static int
-microblaze_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
+microblaze_address_cost (rtx addr, enum machine_mode mode ATTRIBUTE_UNUSED,
+			 bool speed ATTRIBUTE_UNUSED)
 {
   return COSTS_N_INSNS (microblaze_address_insns (addr, GET_MODE (addr)));
 }
Index: gcc/config/xtensa/xtensa.c
===================================================================
--- gcc/config/xtensa/xtensa.c	(revision 190840)
+++ gcc/config/xtensa/xtensa.c	(working copy)
@@ -211,7 +211,7 @@ 
 #undef TARGET_RTX_COSTS
 #define TARGET_RTX_COSTS xtensa_rtx_costs
 #undef TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST hook_int_rtx_mode_bool_0
 
 #undef TARGET_MEMBER_TYPE_FORCES_BLK
 #define TARGET_MEMBER_TYPE_FORCES_BLK xtensa_member_type_forces_blk
Index: gcc/config/spu/spu.c
===================================================================
--- gcc/config/spu/spu.c	(revision 190840)
+++ gcc/config/spu/spu.c	(working copy)
@@ -7161,7 +7161,7 @@ 
 #define TARGET_RTX_COSTS spu_rtx_costs
 
 #undef TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST hook_int_rtx_mode_bool_0
 
 #undef TARGET_SCHED_ISSUE_RATE
 #define TARGET_SCHED_ISSUE_RATE spu_sched_issue_rate
Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c	(revision 190840)
+++ gcc/config/mips/mips.c	(working copy)
@@ -3943,9 +3943,10 @@ 
 /* Implement TARGET_ADDRESS_COST.  */
 
 static int
-mips_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
+mips_address_cost (rtx addr, enum machine_mode mode,
+		   bool speed ATTRIBUTE_UNUSED)
 {
-  return mips_address_insns (addr, SImode, false);
+  return mips_address_insns (addr, mode, false);
 }
 
 /* Information about a single instruction in a multi-instruction
Index: gcc/config/mep/mep.c
===================================================================
--- gcc/config/mep/mep.c	(revision 190840)
+++ gcc/config/mep/mep.c	(working copy)
@@ -212,7 +212,7 @@ 
 static rtx mep_make_bundle (rtx, rtx);
 static void mep_bundle_insns (rtx);
 static bool mep_rtx_cost (rtx, int, int, int, int *, bool);
-static int mep_address_cost (rtx, bool);
+static int mep_address_cost (rtx, enum machine_mode, bool);
 static void mep_setup_incoming_varargs (cumulative_args_t, enum machine_mode,
 					tree, int *, int);
 static bool mep_pass_by_reference (cumulative_args_t cum, enum machine_mode,
@@ -7152,7 +7152,9 @@ 
 }
 
 static int
-mep_address_cost (rtx addr ATTRIBUTE_UNUSED, bool ATTRIBUTE_UNUSED speed_p)
+mep_address_cost (rtx addr ATTRIBUTE_UNUSED,
+		  enum machine_mode mode ATTRIBUTE_UNUSED,
+		  bool ATTRIBUTE_UNUSED speed_p)
 {
   return 1;
 }
Index: gcc/config/v850/v850.c
===================================================================
--- gcc/config/v850/v850.c	(revision 190840)
+++ gcc/config/v850/v850.c	(working copy)
@@ -3130,7 +3130,7 @@ 
 #define TARGET_RTX_COSTS v850_rtx_costs
 
 #undef  TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST hook_int_rtx_mode_bool_0
 
 #undef  TARGET_MACHINE_DEPENDENT_REORG
 #define TARGET_MACHINE_DEPENDENT_REORG v850_reorg
Index: gcc/config/mcore/mcore.c
===================================================================
--- gcc/config/mcore/mcore.c	(revision 190840)
+++ gcc/config/mcore/mcore.c	(working copy)
@@ -191,7 +191,7 @@ 
 #undef  TARGET_RTX_COSTS
 #define TARGET_RTX_COSTS 		mcore_rtx_costs
 #undef  TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST 		hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST 		hook_int_rtx_mode_bool_0
 #undef  TARGET_MACHINE_DEPENDENT_REORG
 #define TARGET_MACHINE_DEPENDENT_REORG	mcore_reorg
 
Index: gcc/config/mmix/mmix.c
===================================================================
--- gcc/config/mmix/mmix.c	(revision 190840)
+++ gcc/config/mmix/mmix.c	(working copy)
@@ -223,7 +223,7 @@ 
 #undef TARGET_RTX_COSTS
 #define TARGET_RTX_COSTS mmix_rtx_costs
 #undef TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
+#define TARGET_ADDRESS_COST hook_int_rtx_mode_bool_0
 
 #undef TARGET_REGISTER_MOVE_COST
 #define TARGET_REGISTER_MOVE_COST mmix_register_move_cost
Index: gcc/config/iq2000/iq2000.c
===================================================================
--- gcc/config/iq2000/iq2000.c	(revision 190840)
+++ gcc/config/iq2000/iq2000.c	(working copy)
@@ -152,7 +152,7 @@ 
 					   enum machine_mode, tree, int *,
 					   int);
 static bool iq2000_rtx_costs          (rtx, int, int, int, int *, bool);
-static int  iq2000_address_cost       (rtx, bool);
+static int  iq2000_address_cost       (rtx, enum machine_mode, bool);
 static section *iq2000_select_section (tree, int, unsigned HOST_WIDE_INT);
 static rtx  iq2000_legitimize_address (rtx, rtx, enum machine_mode);
 static bool iq2000_pass_by_reference  (cumulative_args_t, enum machine_mode,
@@ -779,7 +779,7 @@ 
 /* Provide the costs of an addressing mode that contains ADDR.  */
 
 static int
-iq2000_address_cost (rtx addr, bool speed)
+iq2000_address_cost (rtx addr, enum machine_mode mode, bool speed)
 {
   switch (GET_CODE (addr))
     {
@@ -830,7 +830,7 @@ 
 	  case LABEL_REF:
 	  case HIGH:
 	  case LO_SUM:
-	    return iq2000_address_cost (plus1, speed) + 1;
+	    return iq2000_address_cost (plus1, mode, speed) + 1;
 
 	  default:
 	    break;
Index: gcc/config/score/score-protos.h
===================================================================
--- gcc/config/score/score-protos.h	(revision 190840)
+++ gcc/config/score/score-protos.h	(working copy)
@@ -39,7 +39,7 @@ 
 extern bool score_unaligned_load (rtx* ops);
 extern bool score_unaligned_store (rtx* ops);
 extern bool score_block_move (rtx* ops);
-extern int score_address_cost (rtx addr, bool speed);
+extern int score_address_cost (rtx addr, enum machine_mode, bool speed);
 extern int score_address_p (enum machine_mode mode, rtx x, int strict);
 extern int score_reg_class (int regno);
 extern int score_hard_regno_mode_ok (unsigned int, enum machine_mode);
Index: gcc/config/score/score.c
===================================================================
--- gcc/config/score/score.c	(revision 190840)
+++ gcc/config/score/score.c	(working copy)
@@ -1232,7 +1232,7 @@ 
 
 /* Implement TARGET_ADDRESS_COST macro.  */
 int
-score_address_cost (rtx addr,
+score_address_cost (rtx addr, enum machine_mode mode ATTRIBUTE_UNUSED,
 		    bool speed ATTRIBUTE_UNUSED)
 {
   return score_address_insns (addr, SImode);
Index: gcc/config/cr16/cr16.c
===================================================================
--- gcc/config/cr16/cr16.c	(revision 190840)
+++ gcc/config/cr16/cr16.c	(working copy)
@@ -1286,7 +1286,8 @@ 
 
 /* Return cost of the memory address x.  */
 static int
-cr16_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
+cr16_address_cost (rtx addr, enum machine_mode mode ATTRIBUTE_UNUSED,
+		   bool speed ATTRIBUTE_UNUSED)
 {
   enum cr16_addrtype addrtype;
   struct cr16_address address;
Index: gcc/config/bfin/bfin.c
===================================================================
--- gcc/config/bfin/bfin.c	(revision 190840)
+++ gcc/config/bfin/bfin.c	(working copy)
@@ -1288,7 +1288,9 @@ 
    All addressing modes are equally cheap on the Blackfin.  */
 
 static int
-bfin_address_cost (rtx addr ATTRIBUTE_UNUSED, bool speed ATTRIBUTE_UNUSED)
+bfin_address_cost (rtx addr ATTRIBUTE_UNUSED,
+		   enum machine_mode mode ATTRIBUTE_UNUSED,
+		   bool speed ATTRIBUTE_UNUSED)
 {
   return 1;
 }
Index: gcc/config/avr/avr.c
===================================================================
--- gcc/config/avr/avr.c	(revision 190840)
+++ gcc/config/avr/avr.c	(working copy)
@@ -8886,7 +8886,8 @@ 
 /* Implement `TARGET_ADDRESS_COST'.  */
 
 static int
-avr_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
+avr_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
+		  bool speed ATTRIBUTE_UNUSED)
 {
   int cost = 4;