On Mon, Jun 08, 2026 at 08:19:36AM +0100, Richard Sandiford wrote:
> r17-899-g52d5a8870d2108 added a pattern with a nested vec_duplicate,
> but I think those should be folded down to a single vec_duplicate.
> 
> The later:
> 
>   if (VECTOR_MODE_P (mode)
>       && vec_duplicate_p (op, &elt)
>       && code != VEC_DUPLICATE)
> 
> handles only scalar elements, but this rule applies to vec_duplicates
> of vectors as well.
> 
> A bit of scripting suggests that this was the only use of nested
> vec_duplicates in the md files.
> 
> This is tested by gcc.target/aarch64/sve/vec_init_5.c.
> 
> Tested on aarch64-linux-gnu, powerpc64le-linux-gnu and x86_64-linux-gnu.
> OK to install?
> 
> Richard
> 
> 
> gcc/
>       * simplify-rtx.cc (simplify_context::simplify_unary_operation_1):
>       Simplify vec_duplicates of vec_duplicates.
>       * config/aarch64/aarch64.md
>       (*aarch64_vec_duplicate_subvector<vconsv><vconq><mode>): Remove
>       nested vec_duplicate.
> ---
>  gcc/config/aarch64/aarch64-sve.md | 3 +--
>  gcc/simplify-rtx.cc               | 6 ++++++
>  2 files changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/gcc/config/aarch64/aarch64-sve.md 
> b/gcc/config/aarch64/aarch64-sve.md
> index 585a587d8cf..723b8d6e6ec 100644
> --- a/gcc/config/aarch64/aarch64-sve.md
> +++ b/gcc/config/aarch64/aarch64-sve.md
> @@ -2895,8 +2895,7 @@
>  (define_insn "*aarch64_vec_duplicate_subvector<vconsv><vconq><mode>"
>    [(set (match_operand:<VCONSV> 0 "register_operand")
>       (vec_duplicate:<VCONSV>
> -       (vec_duplicate:<VCONQ>
> -         (match_operand:VQDUP 1 "register_operand"))))]
> +       (match_operand:VQDUP 1 "register_operand")))]

Hi Richard,

With this change, the "<vconq>" part of the pattern name becomes
superfluous as well.

Thanks,
Artemiy

>    "TARGET_SVE"
>    {@ [ cons: =0 , 1 ]
>       [ w        , r ] mov\t%0.<single_type>, %<single_wx>1
> diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc
> index c2d89641dfc..872ae032869 100644
> --- a/gcc/simplify-rtx.cc
> +++ b/gcc/simplify-rtx.cc
> @@ -1900,6 +1900,12 @@ simplify_context::simplify_unary_operation_1 (rtx_code 
> code, machine_mode mode,
>  #endif
>        break;
>  
> +    case VEC_DUPLICATE:
> +      if (GET_CODE (op) == VEC_DUPLICATE)
> +     return simplify_gen_unary (VEC_DUPLICATE, mode, XEXP (op, 0),
> +                                GET_MODE (XEXP (op, 0)));
> +      break;
> +
>      default:
>        break;
>      }
> -- 
> 2.54.0
> 

Reply via email to