Andrew Stubbs <a...@codesourcery.com> writes:
> This patch changes the operand predicates such that vector constants are 
> permitted during compilation.  This prevents ICEs caused by the compiler 
> trying to emit such instructions without checking.

That sounds like a target-independent bug though.  Why didn't we apply
the predicates in the normal way?

Richard

>
> The machine instruction does not accept constants, but it is expected 
> that the RTL optimizers will remove such artefacts before that becomes a 
> problem, and if not the register allocator will break it out when it 
> checks the constraints.
>
> There's not observable change in the testsuite results, with this patch 
> alone, but the fix is prerequisite to another patch I'm working on.
>
> Andrew
>
> Allow constants in amdgcn extends and truncates
>
> 2019-12-19  Andrew Stubbs  <a...@codesourcery.com>
>
>       gcc/
>       * config/gcn/gcn-valu.md
>       (<convop><VEC_ALL1REG_INT_ALT:mode><VEC_ALL1REG_INT_MODE:mode>2<exec>):
>       Change input predcate to gcn_alu_operand.
>       (extend<VEC_ALL1REG_INT_ALT:mode><VEC_ALL1REG_INT_MODE:mode>2<exec>):
>       Likewise.
>       (truncv64di<mode>2): Likewise.
>       (truncv64di<mode>2_exec): Likewise.
>       (<convop><mode>v64di2): Likewise.
>       (<convop><mode>v64di2_exec): Likewise.
>
> diff --git a/gcc/config/gcn/gcn-valu.md b/gcc/config/gcn/gcn-valu.md
> index 369aae5bfc5..98dc3e0cb5f 100644
> --- a/gcc/config/gcn/gcn-valu.md
> +++ b/gcc/config/gcn/gcn-valu.md
> @@ -2491,18 +2491,18 @@
>       (truncate "trunc")])
>  
>  (define_insn 
> "<convop><VEC_ALL1REG_INT_ALT:mode><VEC_ALL1REG_INT_MODE:mode>2<exec>"
> -  [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand"  "=v")
> +  [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "=v")
>          (zero_convert:VEC_ALL1REG_INT_MODE
> -       (match_operand:VEC_ALL1REG_INT_ALT 1 "register_operand" " v")))]
> +       (match_operand:VEC_ALL1REG_INT_ALT 1 "gcn_alu_operand" " v")))]
>    ""
>    "v_mov_b32_sdwa\t%0, %1 dst_sel:<VEC_ALL1REG_INT_MODE:sdwa> 
> dst_unused:UNUSED_PAD src0_sel:<VEC_ALL1REG_INT_ALT:sdwa>"
>    [(set_attr "type" "vop_sdwa")
>     (set_attr "length" "8")])
>  
>  (define_insn 
> "extend<VEC_ALL1REG_INT_ALT:mode><VEC_ALL1REG_INT_MODE:mode>2<exec>"
> -  [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand"  "=v")
> +  [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "=v")
>          (sign_extend:VEC_ALL1REG_INT_MODE
> -       (match_operand:VEC_ALL1REG_INT_ALT 1 "register_operand" " v")))]
> +       (match_operand:VEC_ALL1REG_INT_ALT 1 "gcn_alu_operand" " v")))]
>    ""
>    "v_mov_b32_sdwa\t%0, sext(%1) src0_sel:<VEC_ALL1REG_INT_ALT:sdwa>"
>    [(set_attr "type" "vop_sdwa")
> @@ -2515,7 +2515,7 @@
>  (define_insn_and_split "truncv64di<mode>2"
>    [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "=v")
>       (truncate:VEC_ALL1REG_INT_MODE
> -       (match_operand:V64DI 1 "register_operand"              " v")))]
> +       (match_operand:V64DI 1 "gcn_alu_operand"               " v")))]
>    ""
>    "#"
>    "reload_completed"
> @@ -2536,7 +2536,7 @@
>    [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand"       "=v")
>       (vec_merge:VEC_ALL1REG_INT_MODE
>         (truncate:VEC_ALL1REG_INT_MODE
> -         (match_operand:V64DI 1 "register_operand"                  " v"))
> +         (match_operand:V64DI 1 "gcn_alu_operand"                   " v"))
>         (match_operand:VEC_ALL1REG_INT_MODE 2 "gcn_alu_or_unspec_operand" 
>                                                                      "U0")
>         (match_operand:DI 3 "gcn_exec_operand"                       " e")))]
> @@ -2559,9 +2559,9 @@
>     (set_attr "length" "4")])
>  
>  (define_insn_and_split "<convop><mode>v64di2"
> -  [(set (match_operand:V64DI 0 "register_operand"               "=v")
> +  [(set (match_operand:V64DI 0 "register_operand"              "=v")
>       (any_extend:V64DI
> -       (match_operand:VEC_ALL1REG_INT_MODE 1 "register_operand" " v")))]
> +       (match_operand:VEC_ALL1REG_INT_MODE 1 "gcn_alu_operand" " v")))]
>    ""
>    "#"
>    "reload_completed"
> @@ -2584,12 +2584,12 @@
>     (set_attr "length" "12")])
>  
>  (define_insn_and_split "<convop><mode>v64di2_exec"
> -  [(set (match_operand:V64DI 0 "register_operand"                 "=v")
> +  [(set (match_operand:V64DI 0 "register_operand"                "=v")
>       (vec_merge:V64DI
>         (any_extend:V64DI
> -         (match_operand:VEC_ALL1REG_INT_MODE 1 "register_operand" " v"))
> -       (match_operand:V64DI 2 "gcn_alu_or_unspec_operand"         "U0")
> -       (match_operand:DI 3 "gcn_exec_operand"                     " e")))]
> +         (match_operand:VEC_ALL1REG_INT_MODE 1 "gcn_alu_operand" " v"))
> +       (match_operand:V64DI 2 "gcn_alu_or_unspec_operand"        "U0")
> +       (match_operand:DI 3 "gcn_exec_operand"                    " e")))]
>    ""
>    "#"
>    "reload_completed"

Reply via email to