noce_convert_multiple_sets has been introduced and extended over time to handle if conversion for blocks with multiple sets. Currently this is focused on register moves and rejects any sort of arithmetic operations.
This series is an extension to allow more sequences to take part in if conversion. The first patch is a required change to emit correct code and the second patch whitelists a larger number of operations through bb_ok_for_noce_convert_multiple_sets. The third patch adds support to rewire multiple registers in noce_convert_multiple_sets_1 and refactors the code with a new helper info struct. The fourth patch removes some old code that should not be needed anymore. For targets that have a rich selection of conditional instructions, like aarch64, I have seen an ~5x increase of profitable if conversions for multiple set blocks in SPEC benchmarks. Also tested with a wide variety of benchmarks and I have not seen performance regressions on either x64 / aarch64. Some samples that previously resulted in a branch but now better use these instructions can be seen in the provided test cases. Bootstrapped and tested on AArch64 and x86-64. Changes in v5: - Loop over SEQ and check modified_in_p for all instructions. - Fix x86-related bug when SEQ modifies COND. Manolis Tsamis (3): ifcvt: handle sequences that clobber flags in noce_convert_multiple_sets ifcvt: Allow more operations in multiple set if conversion ifcvt: Handle multiple rewired regs and refactor noce_convert_multiple_sets gcc/ifcvt.cc | 404 +++++++++--------- gcc/ifcvt.h | 16 + .../aarch64/ifcvt_multiple_sets_arithm.c | 79 ++++ .../aarch64/ifcvt_multiple_sets_rewire.c | 20 + 4 files changed, 312 insertions(+), 207 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/ifcvt_multiple_sets_arithm.c create mode 100644 gcc/testsuite/gcc.target/aarch64/ifcvt_multiple_sets_rewire.c -- 2.34.1