This patch is the main part of the speculation tracking code. It adds a new target-specific pass that is run just before the final branch reorg pass (so that it can clean up any new edge insertions we make). The pass is only run with -mtrack-speculation is passed on the command line.
One thing that did come to light as part of this was that the stack pointer register was not being permitted in comparision instructions. We rely on that for moving the tracking state between SP and the scratch register at function call boundaries.
- config/aarch64/aarch64-speculation.cc: New file.
- config/aarch64/aarch64-passes.def (pass_track_speculation): Add before pass_reorder_blocks.
- config/aarch64/aarch64-protos.h (make_pass_track_speculation): Add prototype.
- config/aarch64/aarch64.c (aarch64_conditional_register_usage): Fix X14 and X15 when tracking speculation.
- config/aarch64/aarch64.md (register name constants): Add SPECULATION_TRACKER_REGNUM and SPECULATION_SCRATCH_REGNUM. (unspec): Add UNSPEC_SPECULATION_TRACKER. (speculation_barrier): New insn attribute. (cmp
- config/aarch64/t-aarch64: Add make rule for aarch64-speculation.o.
- config.gcc (aarch64*-*-*): Add aarch64-speculation.o to extra_objs.
- doc/invoke.texi (AArch64 Options): Document -mtrack-speculation.
b19562a8162 AArch64 - new pass to add conditional-branch speculation tracking
gcc/ChangeLog | 20 ++
gcc/config.gcc | 2 +-
gcc/config/aarch64/aarch64-passes.def | 1 +
gcc/config/aarch64/aarch64-protos.h | 3 +-
gcc/config/aarch64/aarch64-speculation.cc | 494 ++++++++++++++++++++++++++++++
gcc/config/aarch64/aarch64.c | 13 +
gcc/config/aarch64/aarch64.md | 30 +-
gcc/config/aarch64/t-aarch64 | 10 +
gcc/doc/invoke.texi | 10 +-
9 files changed, 578 insertions(+), 5 deletions(-)