On 6/7/2021 2:33 PM, H.J. Lu via Gcc-patches wrote:
On Mon, Jun 7, 2021 at 11:10 AM Richard Biener
<richard.guent...@gmail.com> wrote:
On Mon, Jun 7, 2021 at 7:59 PM Richard Biener
<richard.guent...@gmail.com> wrote:
On Mon, Jun 7, 2021 at 4:19 PM H.J. Lu <hjl.to...@gmail.com> wrote:
On Mon, Jun 7, 2021 at 12:12 AM Richard Sandiford
<richard.sandif...@arm.com> wrote:
"H.J. Lu" <hjl.to...@gmail.com> writes:
Update vec_duplicate to allow to fail so that backend can only allow
broadcasting an integer constant to a vector when broadcast instruction
is available.
I'm not sure why we need this to fail though.  Once the optab is defined
for target X, the optab should handle all duplicates for target X,
even if there are different strategies it can use.

AIUI the case you want to make conditional is the constant case.
I guess the first question is: why don't we simplify those CONSTRUCTORs
to VECTOR_CSTs in gimple?  I'm surprised we still see the constant case
as a constructor here.
The particular testcase for vec_duplicate is gcc.dg/pr100239.c.

If we can't rely on that happening, then would it work to change:

         /* Try using vec_duplicate_optab for uniform vectors.  */
         if (!TREE_SIDE_EFFECTS (exp)
             && VECTOR_MODE_P (mode)
             && eltmode == GET_MODE_INNER (mode)
             && ((icode = optab_handler (vec_duplicate_optab, mode))
                 != CODE_FOR_nothing)
             && (elt = uniform_vector_p (exp)))

to something like:

         /* Try using vec_duplicate_optab for uniform vectors.  */
         if (!TREE_SIDE_EFFECTS (exp)
             && VECTOR_MODE_P (mode)
             && eltmode == GET_MODE_INNER (mode)
             && (elt = uniform_vector_p (exp)))
           {
             if (TREE_CODE (elt) == INTEGER_CST
                 || TREE_CODE (elt) == POLY_INT_CST
                 || TREE_CODE (elt) == REAL_CST
                 || TREE_CODE (elt) == FIXED_CST)
               {
                 rtx src = gen_const_vec_duplicate (mode, expand_normal (node));
                 emit_move_insn (target, src);
                 break;
               }
             …
           }
I will give it a try.
I can confirm that veclower leaves us with an unfolded constant CTOR.
If you file a PR to remind me I'll fix that.
The attached untested patch fixes this for the testcase.

Here is the patch + the testcase.


0001-middle-end-100951-make-sure-to-generate-VECTOR_CST-i.patch

 From aac56894719b59e552b493c970946225ed8c27f6 Mon Sep 17 00:00:00 2001
From: Richard Biener <rguent...@suse.de>
Date: Mon, 7 Jun 2021 20:08:13 +0200
Subject: [PATCH] middle-end/100951 - make sure to generate VECTOR_CST in
  lowering

When vector lowering creates piecewise ops make sure to create
VECTOR_CSTs instead of CONSTRUCTORs when possible.

gcc/

2021-06-07  Richard Biener  <rguent...@suse.de>

        PR middle-end/100951
        * tree-vect-generic.c (): Build a VECTOR_CST if all
        elements are constant.

gcc/testsuite/

2021-06-07  H.J. Lu  <hjl.to...@gmail.com>

        PR middle-end/100951
        * gcc.target/i386/pr100951.c: New test.
Assuming this passed testing it is OK.
jeff

Reply via email to