On Wed, Jun 9, 2021 at 2:03 PM Jeff Law <jeffreya...@gmail.com> wrote: > > > > 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
Richard has committed: commit ffe3a37f54ab866d85bdde48c2a32be5e09d8515 Author: Richard Biener <rguent...@suse.de> Date: Mon Jun 7 20:08:13 2021 +0200 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. -- H.J.