ewlu / gcc-precommit-ci

2 stars 0 forks source link

Patch Status 35877-RISCV_Support_group_size_of_three_in_SLP_store_permute_lowering-1 #1844

Closed github-actions[bot] closed 1 day ago

github-actions[bot] commented 2 months ago

Precommit CI Run information

Logs can be found in the associated Github Actions run: https://github.com/ewlu/gcc-precommit-ci/actions/runs/9793430216

Patch information

Applied patches: 1 -> 1 Associated series: https://patchwork.sourceware.org/project/gcc/list/?series=35877 Last patch applied: https://patchwork.sourceware.org/project/gcc/patch/20240704105814.6040A384A4B5@sourceware.org/ Patch id: 93343

Build Targets

Some targets are built as multilibs. If a build target ends with multilib, please refer to the table below to see all the targets within that multilib. Target name -march string
newlib-rv64gc-lp64d-multilib rv32gc-ilp32d, rv64gc-lp64d
newlib-rv64gcv-lp64d-multilib rv64gcv-lp64d
linux-rv64gcv-lp64d-multilib rv32gcv-ilp32d, rv64gcv-lp64d

Target Information

Target Shorthand -march string
Bitmanip gc_zba_zbb_zbc_zbs

Notes

Testsuite results use a more lenient allowlist to reduce error reporting with flakey tests. Please take a look at the current allowlist. Results come from a sum file comparator. Each patch is applied to a well known, non-broken baseline taken from our gcc postcommit framework (here) which runs the full gcc testsuite every 6 hours. If you have any questions or encounter any issues which may seem like false-positives, please contact us at patchworks-ci@rivosinc.com

github-actions[bot] commented 2 months ago

Lint Status

Lint passed

github-actions[bot] commented 2 months ago

Apply Status

Target Status
Baseline hash: https://github.com/gcc-mirror/gcc/commit/0720394aa9de55e45e7e0a6358b872f8203cd907 Failed
Tip of tree hash: https://github.com/gcc-mirror/gcc/commit/adcfb4fb8fb20a911c795312ff5f5284dba05275 Failed

Command

> git am ../patches/*.patch --whitespace=fix -q --3way --empty=drop

Output

error: sha1 information is lacking or useless (gcc/tree-vect-slp.cc).
error: could not build fake ancestor
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config advice.mergeConflict false"
Patch failed at 0001 RISC-V: Support group size of three in SLP store permute lowering
---
 gcc/testsuite/gcc.dg/vect/slp-53.c | 15 +++++++
 gcc/testsuite/gcc.dg/vect/slp-54.c | 18 +++++++++
 gcc/tree-vect-slp.cc               | 65 +++++++++++++++++++++++++++++-
 3 files changed, 97 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/vect/slp-53.c
 create mode 100644 gcc/testsuite/gcc.dg/vect/slp-54.c

diff --git a/gcc/testsuite/gcc.dg/vect/slp-53.c b/gcc/testsuite/gcc.dg/vect/slp-53.c
new file mode 100644
index 00000000000..d8cd5f85b3c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/slp-53.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+void foo (int * __restrict x, int *y)
+{
+  x = __builtin_assume_aligned (x, __BIGGEST_ALIGNMENT__);
+  y = __builtin_assume_aligned (y, __BIGGEST_ALIGNMENT__);
+  for (int i = 0; i < 1024; ++i)
+    {
+      x[3*i+0] = y[2*i+0] * 7 + 5;
+      x[3*i+1] = y[2*i+1] * 2;
+      x[3*i+2] = y[2*i+0] + 3;
+    }
+}
+
+/* { dg-final { scan-tree-dump "vectorizing stmts using SLP" "vect" { target { vect_int && vect_int_mult } xfail vect_load_lanes } } } */
diff --git a/gcc/testsuite/gcc.dg/vect/slp-54.c b/gcc/testsuite/gcc.dg/vect/slp-54.c
new file mode 100644
index 00000000000..ab66b349d1f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/slp-54.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void foo (int * __restrict x, int *y)
+{
+  x = __builtin_assume_aligned (x, __BIGGEST_ALIGNMENT__);
+  y = __builtin_assume_aligned (y, __BIGGEST_ALIGNMENT__);
+  for (int i = 0; i < 1024; ++i)
+    {
+      x[6*i+0] = y[4*i+0] * 7 + 5;
+      x[6*i+1] = y[4*i+1] * 2;
+      x[6*i+2] = y[4*i+2] + 3;
+      x[6*i+3] = y[4*i+3] * 7 + 5;
+      x[6*i+4] = y[4*i+0] * 2;
+      x[6*i+5] = y[4*i+3] + 3;
+    }
+}
+
+/* { dg-final { scan-tree-dump "vectorizing stmts using SLP" "vect" { target { vect_int && vect_int_mult } xfail riscv*-*-* } } } */
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 170d0cf7fa1..2dc6d365303 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -3714,6 +3714,69 @@ vect_build_slp_instance (vec_info *vinfo,
         when the number of lanes is even.  */
          while (SLP_TREE_CHILDREN (perm).length () > 2)
        {
+         /* When we have three equal sized groups left the pairwise
+            reduction does not result in a scheme that avoids using
+            three vectors.  Instead merge the first two groups
+            to the final size with do-not-care elements (chosen
+            from the first group) and then merge with the third.
+              { A0, B0,  x, A1, B1,  x, ... }
+           -> { A0, B0, C0, A1, B1, C1, ... }
+            This handles group size of three (and at least
+            power-of-two multiples of that).  */
+         if (SLP_TREE_CHILDREN (perm).length () == 3
+             && (SLP_TREE_LANES (SLP_TREE_CHILDREN (perm)[0])
+             == SLP_TREE_LANES (SLP_TREE_CHILDREN (perm)[1]))
+             && (SLP_TREE_LANES (SLP_TREE_CHILDREN (perm)[0])
+             == SLP_TREE_LANES (SLP_TREE_CHILDREN (perm)[2])))
+           {
+             int ai = 0;
+             int bi = 1;
+             slp_tree a = SLP_TREE_CHILDREN (perm)[ai];
+             slp_tree b = SLP_TREE_CHILDREN (perm)[bi];
+             unsigned n = SLP_TREE_LANES (perm);
+
+             slp_tree permab
+           = vect_create_new_slp_node (2, VEC_PERM_EXPR);
+             SLP_TREE_LANES (permab) = n;
+             SLP_TREE_LANE_PERMUTATION (permab).create (n);
+             SLP_TREE_VECTYPE (permab) = SLP_TREE_VECTYPE (perm);
+             /* ???  Should be NULL but that's not expected.  */
+             SLP_TREE_REPRESENTATIVE (permab)
+           = SLP_TREE_REPRESENTATIVE (perm);
+             SLP_TREE_CHILDREN (permab).quick_push (a);
+             for (unsigned k = 0; k < SLP_TREE_LANES (a); ++k)
+           SLP_TREE_LANE_PERMUTATION (permab)
+             .quick_push (std::make_pair (0, k));
+             SLP_TREE_CHILDREN (permab).quick_push (b);
+             for (unsigned k = 0; k < SLP_TREE_LANES (b); ++k)
+           SLP_TREE_LANE_PERMUTATION (permab)
+             .quick_push (std::make_pair (1, k));
+             /* Push the do-not-care lanes.  */
+             for (unsigned k = 0; k < SLP_TREE_LANES (a); ++k)
+           SLP_TREE_LANE_PERMUTATION (permab)
+             .quick_push (std::make_pair (0, k));
+
+             /* Put the merged node into 'perm', in place of a.  */
+             SLP_TREE_CHILDREN (perm)[ai] = permab;
+             /* Adjust the references to b in the permutation
+            of perm and to the later children which we'll
+            remove.  */
+             for (unsigned k = 0; k < SLP_TREE_LANES (perm); ++k)
+           {
+             std::pair<unsigned, unsigned> &p
+                 = SLP_TREE_LANE_PERMUTATION (perm)[k];
+             if (p.first == (unsigned) bi)
+               {
+                 p.first = ai;
+                 p.second += SLP_TREE_LANES (a);
+               }
+             else if (p.first > (unsigned) bi)
+               p.first--;
+           }
+             SLP_TREE_CHILDREN (perm).ordered_remove (bi);
+             break;
+           }
+
          /* Pick the two nodes with the least number of lanes,
             prefer the earliest candidate and maintain ai < bi.  */
          int ai = -1;
@@ -3750,7 +3813,7 @@ vect_build_slp_instance (vec_info *vinfo,
          SLP_TREE_LANES (permab) = n;
          SLP_TREE_LANE_PERMUTATION (permab).create (n);
          SLP_TREE_VECTYPE (permab) = SLP_TREE_VECTYPE (perm);
-         /* ???  We should set this NULL but that's not expected.  */
+         /* ???  Should be NULL but that's not expected.  */
          SLP_TREE_REPRESENTATIVE (permab)
            = SLP_TREE_REPRESENTATIVE (perm);
          SLP_TREE_CHILDREN (permab).quick_push (a);

Additional information