This series of patches extends the mode-switching pass so that it can be used for AArch64's SME. I wondered about including a detailed description of how the SME mode changes work, but it'd probably be a distraction. The system is quite complex and target-specific, and hopefully the details aren't necessary to understand the motivation.
One of the main requirements for one of the mode-switched "entities" is that the current mode must always be known at compile time. It would be too cumbersome to work out the current mode at runtime and make a dynamic choice about what to do. The entity therefore wants the usual LCM placement where possible, but would rather have redundant mode transitions than transitions from unknown modes. In many cases, the modified pass seems to generate optimal or near-optimal mode-switching code, even with these additional requirements. Tests are included with the SME work. Bootstrapped & regression-tested on aarch64-linux-gnu and x86_64-linux-gnu, although only the latter is useful since AArch64 doesn't yet use the pass. Also tested by building crosses for epiphany-elf, riscv64-elf and sh-linux-gnu, to pick one triplet per other target that uses mode switching. OK to install? Thanks, Richard Richard Sandiford (12): mode-switching: Tweak the macro/hook documentation mode-switching: Add note problem mode-switching: Avoid quadractic list operation mode-switching: Fix the mode passed to the emit hook mode-switching: Simplify recording of transparency mode-switching: Tweak entry/exit handling mode-switching: Allow targets to set the mode for EH handlers mode-switching: Pass set of live registers to the needed hook mode-switching: Pass the set of live registers to the after hook mode-switching: Use 1-based edge aux fields mode-switching: Add a target-configurable confluence operator mode-switching: Add a backprop hook gcc/config/epiphany/epiphany-protos.h | 7 +- gcc/config/epiphany/epiphany.cc | 7 +- gcc/config/epiphany/mode-switch-use.cc | 2 +- gcc/config/i386/i386.cc | 4 +- gcc/config/riscv/riscv.cc | 4 +- gcc/config/sh/sh.cc | 9 +- gcc/doc/tm.texi | 126 ++++-- gcc/doc/tm.texi.in | 32 +- gcc/mode-switching.cc | 582 +++++++++++++++++++++---- gcc/target.def | 103 ++++- 10 files changed, 714 insertions(+), 162 deletions(-) -- 2.25.1