On Sat, Apr 11, 2020 at 04:27:07PM -0700, Sasha Krassovsky via Gcc wrote:
> However, in the following example, the load does get the cost applied to it
> but the store to B does not.
>
> void bar(__attribute__((remote(5)) int *a, int *b)
> {
> if(*A > 5)
> *A = 10;
> *B = *A;
> }
>
> I was wondering if this is the correct way to approach this problem, and also
> why the attribute sometimes gets applied and sometimes not.
There are many places in the compiler that only consider the cost of
the source of a SET insn, that is, given something like
(set (mem (address)) (op (reg) (const_int)))
will only pass (op (reg) (const_int)) to rtx_cost, and from there to
TARGET_RTX_COSTS. Those places are generally looking at costs to see
whether variations in the SET source are profitable, for example
whether it is better to put the (const_int) in another reg first then
change the expression to (op (reg) (reg2)).
Other places, eg. rtlanal.c:seq_cost do pass the entire SET.
--
Alan Modra
Australia Development Lab, IBM