https://gcc.gnu.org/g:87222af419eb272d4b66628abda573ba8fcadc77
commit r16-6687-g87222af419eb272d4b66628abda573ba8fcadc77 Author: Hans-Peter Nilsson <[email protected]> Date: Tue Apr 30 16:22:20 2024 +0200 CRIS: Handle POST_INC in cris_rtx_costs POST_INC is a code that's only supposed to be valid in an address, so it should only be calculated through the TARGET_ADDRESS_COST hook, not by the TARGET_RTX_COSTS hook. But, because rtx_cost does not special-case MEM costs by calling TARGET_ADDRESS_COST, we get here as part of e.g. the auto-inc-dec and combine passes, so deal with it for the time being. Without this, the cost is the value of size_factor * COSTS_N_INSNS (1), i.e. 4 per word. There's no obvious observable effect for generated code (coremark, libgcc and newlib-libc checked for -march=v10), but it may make a difference in the future, so be safe and correct the cost. Tested at r16-6493-ge77ba7ef8c75 for cris-elf. That the cost actually is changed is observable mostly simply by applying -dp when compiling int incref(int n, char *p) { int sum = 0; while (n--) sum += *p++; return sum; } and seeing that the cost for the single autoincrement is changed from e.g. adds.b [$r11+],$r10 ;# 15 [c=12 l=2] *addsqisi_swap/1 to adds.b [$r11+],$r10 ;# 15 [c=8 l=2] *addsqisi_swap/1 gcc: * config/cris/cris.cc (cris_rtx_costs) <POST_INC>: Handle POST_INC as ZERO_EXTEND and SIGN_EXTEND, i.e. as an operator without cost. Diff: --- gcc/config/cris/cris.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/config/cris/cris.cc b/gcc/config/cris/cris.cc index 4110a452a1e2..ff487a0fcdc1 100644 --- a/gcc/config/cris/cris.cc +++ b/gcc/config/cris/cris.cc @@ -2061,7 +2061,7 @@ cris_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno, } /* fall through */ - case ZERO_EXTEND: case SIGN_EXTEND: + case ZERO_EXTEND: case SIGN_EXTEND: case POST_INC: *total = rtx_cost (XEXP (x, 0), VOIDmode, (enum rtx_code) outer_code, opno, speed); return true;
