diff options
author | Oleg Endo <olegendo@gcc.gnu.org> | 2024-10-13 11:36:38 +0900 |
---|---|---|
committer | Oleg Endo <olegendo@gcc.gnu.org> | 2024-10-14 11:20:47 +0900 |
commit | b717c462b96e7870f8081d2bc330e4749a4b0538 (patch) | |
tree | 3d271965f2dd732e10c40cd6abd437ac6d088622 | |
parent | 7ec8b4bf42fe9e27f7cf65fafae62e57be784db2 (diff) | |
download | gcc-b717c462b96e7870f8081d2bc330e4749a4b0538.zip gcc-b717c462b96e7870f8081d2bc330e4749a4b0538.tar.gz gcc-b717c462b96e7870f8081d2bc330e4749a4b0538.tar.bz2 |
SH: Fix cost estimation of mem load/store
For memory loads/stores (that contain a MEM rtx) sh_rtx_costs would wrongly
report a cost lower than 1 insn which is not accurate as it makes loads/stores
appear cheaper than simple arithmetic insns. The cost of a load/store insn is
at least 1 insn plus the cost of the address expression (some addressing modes
can be considered more expensive than others due to additional constraints).
gcc/ChangeLog:
PR target/113533
* config/sh/sh.cc (sh_rtx_costs): Adjust cost estimation of MEM rtx
to be always at least COST_N_INSNS (1). Forward speed argument to
sh_address_cost.
Co-authored-by: Roger Sayle <roger@nextmovesoftware.com>
-rw-r--r-- | gcc/config/sh/sh.cc | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/gcc/config/sh/sh.cc b/gcc/config/sh/sh.cc index 7391b8d..6ad202f 100644 --- a/gcc/config/sh/sh.cc +++ b/gcc/config/sh/sh.cc @@ -3231,7 +3231,7 @@ multcosts (rtx x ATTRIBUTE_UNUSED) static bool sh_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED, int outer_code, int opno ATTRIBUTE_UNUSED, - int *total, bool speed ATTRIBUTE_UNUSED) + int *total, bool speed) { int code = GET_CODE (x); @@ -3264,10 +3264,12 @@ sh_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED, int outer_code, } return false; - /* The cost of a mem access is mainly the cost of the address mode. */ + /* The cost of a mem access is mainly the cost of the address mode on top + of the cost of the load/store insn itself. */ case MEM: *total = sh_address_cost (XEXP (x, 0), GET_MODE (x), MEM_ADDR_SPACE (x), - true); + speed) + + COSTS_N_INSNS (1); return true; case IF_THEN_ELSE: @@ -3317,7 +3319,8 @@ sh_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED, int outer_code, { *total = sh_address_cost (XEXP (XEXP (x, 0), 0), GET_MODE (XEXP (x, 0)), - MEM_ADDR_SPACE (XEXP (x, 0)), true); + MEM_ADDR_SPACE (XEXP (x, 0)), speed) + + COSTS_N_INSNS (1); return true; } return false; @@ -3335,7 +3338,8 @@ sh_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED, int outer_code, /* Handle SH2A's movu.b and movu.w insn. */ *total = sh_address_cost (XEXP (XEXP (x, 0), 0), GET_MODE (XEXP (x, 0)), - MEM_ADDR_SPACE (XEXP (x, 0)), true); + MEM_ADDR_SPACE (XEXP (x, 0)), speed) + + COSTS_N_INSNS (1); return true; } return false; @@ -3350,14 +3354,16 @@ sh_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED, int outer_code, { *total = sh_address_cost (XEXP (XEXP (xx, 0), 0), GET_MODE (XEXP (xx, 0)), - MEM_ADDR_SPACE (XEXP (xx, 0)), true); + MEM_ADDR_SPACE (XEXP (xx, 0)), speed); + + COSTS_N_INSNS (1); return true; } if (GET_CODE (xx) == SET && MEM_P (XEXP (xx, 1))) { *total = sh_address_cost (XEXP (XEXP (xx, 1), 0), GET_MODE (XEXP (xx, 1)), - MEM_ADDR_SPACE (XEXP (xx, 1)), true); + MEM_ADDR_SPACE (XEXP (xx, 1)), speed); + + COSTS_N_INSNS (1); return true; } } |