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