]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
CRIS: Handle POST_INC in cris_rtx_costs
authorHans-Peter Nilsson <hp@axis.com>
Tue, 30 Apr 2024 14:22:20 +0000 (16:22 +0200)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Sun, 11 Jan 2026 15:34:35 +0000 (16:34 +0100)
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.

gcc/config/cris/cris.cc

index 4110a452a1e2e308b7ff1217c2135e6e41bfb102..ff487a0fcdc1f092f26923834c67c006718ee47d 100644 (file)
@@ -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;