On Fri, Feb 22, 2019 at 06:20:51PM -0600, Jakub Jelinek wrote:
> Hi!
> 
> The testcase in the PR doesn't hoist any memory loads from the large switch
> before the switch on aarch64 and arm (unlike e.g. x86), because the
> arm/aarch64 casesi patterns don't properly annotate the memory load from the
> jump table.  It is created by gen_* and in RTL directly one can't specify
> the needed flags (MEM_READONLY_P and MEM_NOTRAP_P).
> 
> Fixed thusly, bootstrapped/regtested on armv7hl-linux-gnueabi and
> aarch64-linux, ok for trunk?
> 
> 2019-02-23  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR target/70341
>       * config/aarch64/aarch64.md (casesi): Create the casesi_dispatch
>       MEM manually here, set MEM_READONLY_P and MEM_NOTRAP_P on it.

This AArch64 part is OK for trunk.

Thanks,
James

> --- gcc/config/aarch64/aarch64.md.jj  2019-01-19 09:39:18.847831222 +0100
> +++ gcc/config/aarch64/aarch64.md     2019-02-21 15:25:27.874532191 +0100
> @@ -622,13 +622,27 @@ (define_expand "casesi"
>                                   operands[0], operands[2], operands[4]));
>  
>      operands[2] = force_reg (DImode, gen_rtx_LABEL_REF (DImode, 
> operands[3]));
> -    emit_jump_insn (gen_casesi_dispatch (operands[2], operands[0],
> -                                      operands[3]));
> +    operands[2]
> +      = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, operands[2], operands[0]),
> +                     UNSPEC_CASESI);
> +    operands[2] = gen_rtx_MEM (DImode, operands[2]);
> +    MEM_READONLY_P (operands[2]) = 1;
> +    MEM_NOTRAP_P (operands[2]) = 1;
> +    emit_jump_insn (gen_casesi_dispatch (operands[2], operands[3]));
>      DONE;
>    }
>  )
>  
> -(define_insn "casesi_dispatch"
> +(define_expand "casesi_dispatch"
> +  [(parallel
> +    [(set (pc) (match_operand:DI 0 ""))
> +     (clobber (reg:CC CC_REGNUM))
> +     (clobber (match_scratch:DI 2))
> +     (clobber (match_scratch:DI 3))
> +     (use (label_ref:DI (match_operand 1 "")))])]
> +  "")
> +
> +(define_insn "*casesi_dispatch"
>    [(parallel
>      [(set (pc)
>         (mem:DI (unspec [(match_operand:DI 0 "register_operand" "r")
> @@ -637,7 +651,7 @@ (define_insn "casesi_dispatch"
>       (clobber (reg:CC CC_REGNUM))
>       (clobber (match_scratch:DI 3 "=r"))
>       (clobber (match_scratch:DI 4 "=r"))
> -     (use (label_ref (match_operand 2 "" "")))])]
> +     (use (label_ref:DI (match_operand 2 "" "")))])]
>    ""
>    "*
>    return aarch64_output_casesi (operands);
> 
>       Jakub

Reply via email to