On Thu, May 23, 2019 at 12:41 AM Jakub Jelinek <ja...@redhat.com> wrote:
>
> Hi!
>
> For stack_protect_test_[sd]i we don't use comparison, so that we clear the
> content of the register and don't keep the stack canary in any register for
> security reasons, but as mentioned in the PR, using sub instead of xor
> achieves the same effect in the likely case (no failure), in the failure
> case neither xor nor sub wipes it completely but in that case the program
> terminates anyway through __stack_chk_fail, and, on some CPUs sub can be
> fused with the conditional branch, while xor can't.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> Incrementally, we should consider handling e.g. *subsi_2{,_zext} and similar
> patterns and also this stack_protect_test_[sd]i in ix86_macro_fusion_pair_p,
> not sure if unconditionally, or only when tuning for skylake+ / generic.
>
> 2019-05-22  Jakub Jelinek  <ja...@redhat.com>
>
>         PR target/90568
>         * config/i386/i386.md (stack_protect_test_<mode>): Use sub instead
>         of xor.

LGTM.

Thanks,
Uros.

> --- gcc/config/i386/i386.md.jj  2019-05-15 23:36:47.829062261 +0200
> +++ gcc/config/i386/i386.md     2019-05-22 18:40:04.360359867 +0200
> @@ -19513,7 +19513,7 @@ (define_insn "stack_protect_test_<mode>"
>                     UNSPEC_SP_TEST))
>     (clobber (match_scratch:PTR 3 "=&r"))]
>    ""
> -  "mov{<imodesuffix>}\t{%1, %3|%3, %1}\;xor{<imodesuffix>}\t{%2, %3|%3, %2}"
> +  "mov{<imodesuffix>}\t{%1, %3|%3, %1}\;sub{<imodesuffix>}\t{%2, %3|%3, %2}"
>    [(set_attr "type" "multi")])
>
>  (define_insn "sse4_2_crc32<mode>"
>
>         Jakub

Reply via email to