Hi,
finally I got around to reworking this patch set for
if conversion so it is rather a v3 already. Since so
much time has passed, I'm not replying to the old thread.
There are several problems with noce_convert_multiple
and most are due to the instructions costs not being
properly counted:
- We create too many temporaries that, by default,
are counted as instruction even though they will
be removed by later passes.
- We emit a new compare for every cmov.
- Original costs are unfairly low.
These are tackled in this patch set.
As mentioned in the last discussion, what still remains
is to properly unify some parts of ifcvt. We have several
"sub-passes" that can handle similar situations but the
restrictions of each of them are not clearly documented.
Costing also differs in that we sometimes just count
emitted cmovs and sometimes we indeed use pattern_cost
or insn_cost.
Ideally, we will also unify passing value comparisons
as well as CC comparisons to backends in the future.
This will allow a backend to choose whether to emit
a comparison, re-use a comparison or even get rid of
a comparison by emitting a min/max.
Nonetheless, this patch set improves the situation on
s390 and, in general, allows more accurate costing.
Regards
Robin
Robin Dapp (7):
ifcvt: Check if cmovs are needed.
ifcvt: Allow constants for noce_convert_multiple.
ifcvt: Improve costs handling for noce_convert_multiple.
ifcvt/optabs: Allow using a CC comparison for emit_conditional_move.
ifcvt: Try re-using CC for conditional moves.
testsuite/s390: Add tests for noce_convert_multiple.
s390: Increase costs for load on condition and change movqicc
expander.
gcc/config/s390/s390.c| 2 +-
gcc/config/s390/s390.md | 4 +-
gcc/ifcvt.c | 273 +++---
gcc/optabs.c | 163 +++
gcc/optabs.h | 1 +
gcc/testsuite/gcc.dg/ifcvt-4.c| 2 +-
.../gcc.target/s390/ifcvt-two-insns-bool.c| 39 +++
.../gcc.target/s390/ifcvt-two-insns-int.c | 39 +++
.../gcc.target/s390/ifcvt-two-insns-long.c| 39 +++
9 files changed, 464 insertions(+), 98 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/s390/ifcvt-two-insns-bool.c
create mode 100644 gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c
create mode 100644 gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c
--
2.31.1