This is a small series of patches to fix various problems in cost
calculations that together caused PR71280, a missed optimization
opportunity.
A summary of the problems:
1. I noticed comparisons between set_src_cost and set_rtx_cost seemed to
be invalid. There seems to be no good reason that insn_rtx_cost
shouldn't use the latter. It also makes the numbers comparable to the
ones you get from seq_cost.
2. The i386 backend mishandles SET rtxs. If you have a fairly plain
single-insn SET, you tend to get COSTS_N_INSNS (2) out of set_rtx_cost,
because rtx_costs has a default of COSTS_N_INSNS (1) for a SET, and you
get the cost of the src in addition to that.
3. ifcvt computes the sum of costs for the involved blocks, but only
makes a before/after comparison when optimizing for size. When
optimizing for speed, it uses max_seq_cost, which is an estimate
computed from BRANCH_COST, which in turn can be zero for predictable
branches on x86.
It seems a little risky to tweak costs this late in the process, but all
of these should be improvements so it would put us on a better footing
for fixing performance issues. I'll leave it to the reviewer to decide
whether we want this now or after gcc-7.
The series was bootstrapped and tested on x86_64-linux. There's the
following new guality fail:
-PASS: gcc.dg/guality/pr54693-2.c -Os line 21 x == 10 - i
-PASS: gcc.dg/guality/pr54693-2.c -Os line 21 y == 20 - 2 * i
+FAIL: gcc.dg/guality/pr54693-2.c -Os line 21 x == 10 - i
+FAIL: gcc.dg/guality/pr54693-2.c -Os line 21 y == 20 - 2 * i
which appears to be caused by loss of debuginfo in ivopts:
- # DEBUG x => (int) ((unsigned int) x_9(D) - (unsigned int) i_14)
- # DEBUG y => (int) ((unsigned int) y_10(D) - (unsigned int) i_14 * 2)
+ # DEBUG x => NULL
+ # DEBUG y => NULL
I'd claim this is out of scope for this patch series. So, ok?
Bernd