mirror of git://gcc.gnu.org/git/gcc.git
Add narrower_subreg_mode helper function
This patch adds a narrowing equivalent of wider_subreg_mode. At present there is only one user. 2017-11-01 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * rtl.h (narrower_subreg_mode): New function. * ira-color.c (update_costs_from_allocno): Use it. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r254304
This commit is contained in:
parent
4b926feae1
commit
b3ad445f85
|
|
@ -1,3 +1,10 @@
|
|||
2017-11-01 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
Alan Hayward <alan.hayward@arm.com>
|
||||
David Sherwood <david.sherwood@arm.com>
|
||||
|
||||
* rtl.h (narrower_subreg_mode): New function.
|
||||
* ira-color.c (update_costs_from_allocno): Use it.
|
||||
|
||||
2017-11-01 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
Alan Hayward <alan.hayward@arm.com>
|
||||
David Sherwood <david.sherwood@arm.com>
|
||||
|
|
|
|||
|
|
@ -1367,15 +1367,14 @@ update_costs_from_allocno (ira_allocno_t allocno, int hard_regno,
|
|||
|| ALLOCNO_ASSIGNED_P (another_allocno))
|
||||
continue;
|
||||
|
||||
if (GET_MODE_SIZE (ALLOCNO_MODE (cp->second)) < GET_MODE_SIZE (mode))
|
||||
/* If we have different modes use the smallest one. It is
|
||||
a sub-register move. It is hard to predict what LRA
|
||||
will reload (the pseudo or its sub-register) but LRA
|
||||
will try to minimize the data movement. Also for some
|
||||
register classes bigger modes might be invalid,
|
||||
e.g. DImode for AREG on x86. For such cases the
|
||||
register move cost will be maximal. */
|
||||
mode = ALLOCNO_MODE (cp->second);
|
||||
/* If we have different modes use the smallest one. It is
|
||||
a sub-register move. It is hard to predict what LRA
|
||||
will reload (the pseudo or its sub-register) but LRA
|
||||
will try to minimize the data movement. Also for some
|
||||
register classes bigger modes might be invalid,
|
||||
e.g. DImode for AREG on x86. For such cases the
|
||||
register move cost will be maximal. */
|
||||
mode = narrower_subreg_mode (mode, ALLOCNO_MODE (cp->second));
|
||||
|
||||
cost = (cp->second == allocno
|
||||
? ira_register_move_cost[mode][rclass][aclass]
|
||||
|
|
|
|||
10
gcc/rtl.h
10
gcc/rtl.h
|
|
@ -2954,6 +2954,16 @@ subreg_lowpart_offset (machine_mode outermode, machine_mode innermode)
|
|||
GET_MODE_SIZE (innermode));
|
||||
}
|
||||
|
||||
/* Given that a subreg has outer mode OUTERMODE and inner mode INNERMODE,
|
||||
return the smaller of the two modes if they are different sizes,
|
||||
otherwise return the outer mode. */
|
||||
|
||||
inline machine_mode
|
||||
narrower_subreg_mode (machine_mode outermode, machine_mode innermode)
|
||||
{
|
||||
return paradoxical_subreg_p (outermode, innermode) ? innermode : outermode;
|
||||
}
|
||||
|
||||
/* Given that a subreg has outer mode OUTERMODE and inner mode INNERMODE,
|
||||
return the mode that is big enough to hold both the outer and inner
|
||||
values. Prefer the outer mode in the event of a tie. */
|
||||
|
|
|
|||
Loading…
Reference in New Issue