mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-01-12 00:05:41 +08:00
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.
This commit is contained in:
committed by
Hans-Peter Nilsson
parent
2b9bbe4301
commit
87222af419
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user