This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 6/7] AArch64 - new pass to add conditional-branch speculation tracking


On 07/09/2018 10:38 AM, Richard Earnshaw wrote:
> 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.
Note that the sp in comparison instructions issue came up with the
improvements to stack-clash that Tamar, Richard S. and you worked on.


> 
> 	* 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<mode>): Allow SP in comparisons.
> 	(speculation_tracker): New insn.
> 	(speculation_barrier): Add speculation_barrier attribute.
> 	* 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.
> ---
>  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 +-
>  8 files changed, 558 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/config/aarch64/aarch64-speculation.cc
Given the consensus forming about using these kind of masking
instructions being the preferred way to mitigate (as opposed to lfence
barriers and the like) I have to ask your opinions about making the bulk
of this a general pass rather than one specific to the aarch backend.
I'd hate to end up duplicating all this stuff across multiple architectures.

I think it all looks pretty reasonable though.

jeff


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]