On Wed, Feb 23, 2022 at 02:02:59PM +0100, Richard Biener wrote: > I'm assuming we're always dealing with > > (set (reg:MODE ..) <src_folded>) > > here and CSE is not substituting into random places of an > instruction(?). I don't know what 'rtx_cost' should evaluate > to for a constant, if it should implicitely evaluate the cost > of putting the result into a register for example.
rtx_cost is no good here (and in most places). rtx_cost should be 0 for anything that is used as input in a machine instruction -- but you need much more context to determine that. insn_cost is much simpler and much easier to use. > Using RTX_COST with SET and 1 at least looks no worse than using > your proposed new target hook and comparing it with the original > unfolded src (again with SET and 1). It is required to generate valid instructions no matter what, before the pass has finished that is. On all more modern architectures it is futile to think you can usefully consider the cost of an RTL expression and derive a real-world cost of the generated code from that. But there is so much more wrong with cse.c :-( Segher