https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86771
--- Comment #20 from Segher Boessenkool <segher at gcc dot gnu.org> --- (In reply to Wilco from comment #19) > Well insn_cost() uses COSTS_N_INSNS (1) for instructions with unknown (zero) > costs. That's a reasonable default and gives more accurate cost comparisons, > eg. 0 + 4 vs 0 + 8 now becomes 4 + 4 vs 4 + 8. You're talking about the default insn_cost, which uses pattern_cost to do the work; pattern_cost returns COSTS_N_INSNS (1) if there is a single SET (or a single SET and a single SET of COMPARE), and set_src_cost of that SET says it is cost 0. It does not say cost 0 for a PARALLEL of two SETs, like you have here. A target-specific insn_cost can return a saner cost for all insns, including for those that are a "real" PARALLEL. (COSTS_N_INSNS (1) isn't minimal of course, it is 4 like you already point out; it is the default insn cost). It never is clear that 0+4 is better than 0+8, because the 0's usually are not the cost of the same insn. > With those changes I think there will be far fewer cases with unknown costs. I'm not sure what changes you propose. > There will be cases where target insn_cost needs to be improved to more > accurately model complex instructions, but that will result in even better > code. The arm port does not _have_ the insn_cost hook implemented; doing that will probably help, sure.