GCC's middle-end provides a default cost model for RTL expressions, for backends that don't specify their own instruction timings, that can be summarized as multiplications are COSTS_N_INSNS(4), divisions are COSTS_N_INSNS(7) and all other operations are COSTS_N_INSNS(1). This patch tweaks the above definition so that fused-multiply-add (FMA) and high-part multiplications cost the same as regular multiplications, or more importantly aren't (by default) considered less expensive. Likewise the saturating forms of multiplication and division cost the same as the regular variants. These values can always be changed by the target, but the goal is to avoid RTL expansion substituting a suitable operation with its saturating equivalent because it (accidentally) looks much cheaper. For example, PR 89845 is about implementing division/modulus via highpart multiply, which may accidentally look extremely cheap. I believe there should be no code generation changes for this patch, but of course I'm happy to address any adverse changes on rare targets. This patch has been tested on x86_64-pc-linux-gnu with make bootstrap and make -k check, both with and without --target_board=unix{-m32}, with no new failures. Ok for mainline? 2022-05-30 Roger Sayle gcc/ChangeLog * rtlanal.cc (rtx_cost) : Treat FMA, SS_MULT, US_MULT, SMUL_HIGHPART and UMUL_HIGHPART as having the same cost as MULT.
: Likewise, SS_DIV and US_DIV have the same default as DIV. Thanks in advance, Roger --