RISC-V: Handle unused-only-live stmts in SLP discovery

Message ID 20240904111121.9A6C9385841C@sourceware.org
State Not applicable
Delegated to: Jeff Law
Headers
Series RISC-V: Handle unused-only-live stmts in SLP discovery |

Checks

Context Check Description
rivoscibot/toolchain-ci-rivos-lint success Lint passed
rivoscibot/toolchain-ci-rivos-apply-patch success Patch applied
rivoscibot/toolchain-ci-rivos-build--newlib-rv64gcv-lp64d-multilib success Build passed
rivoscibot/toolchain-ci-rivos-build--linux-rv64gc_zba_zbb_zbc_zbs-lp64d-multilib success Build passed
rivoscibot/toolchain-ci-rivos-build--linux-rv64gcv-lp64d-multilib success Build passed
rivoscibot/toolchain-ci-rivos-build--newlib-rv64gc-lp64d-non-multilib success Build passed
rivoscibot/toolchain-ci-rivos-build--linux-rv64gc-lp64d-non-multilib success Build passed
rivoscibot/toolchain-ci-rivos-test success Testing passed
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm success Test passed

Commit Message

Richard Biener Sept. 4, 2024, 11:10 a.m. UTC
  The following adds SLP discovery for roots that are only live but
otherwise unused.  These are usually inductions.  This allows a
few more testcases to be handled fully with SLP, for example
gcc.dg/vect/no-scevccp-pr86725-1.c

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

	* tree-vect-slp.cc (vect_analyze_slp): Analyze SLP for live
	but otherwise unused defs.
---
 gcc/tree-vect-slp.cc | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)
  

Patch

diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 41bc92b138a..91d6927016d 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -4704,6 +4704,36 @@  vect_analyze_slp (vec_info *vinfo, unsigned max_tree_size)
 	      saved_stmts.release ();
 	    }
 	}
+
+      /* Make sure to vectorize only-live stmts, usually inductions.  */
+      for (edge e : get_loop_exit_edges (LOOP_VINFO_LOOP (loop_vinfo)))
+	for (auto gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi);
+	     gsi_next (&gsi))
+	  {
+	    gphi *lc_phi = *gsi;
+	    tree def = gimple_phi_arg_def_from_edge (lc_phi, e);
+	    stmt_vec_info stmt_info;
+	    if (TREE_CODE (def) == SSA_NAME
+		&& !virtual_operand_p (def)
+		&& (stmt_info = loop_vinfo->lookup_def (def))
+		&& STMT_VINFO_RELEVANT (stmt_info) == vect_used_only_live
+		&& STMT_VINFO_LIVE_P (stmt_info)
+		&& (STMT_VINFO_DEF_TYPE (stmt_info) == vect_induction_def
+		    || (STMT_VINFO_DEF_TYPE (stmt_info) == vect_internal_def
+			&& STMT_VINFO_REDUC_IDX (stmt_info) == -1)))
+	      {
+		vec<stmt_vec_info> stmts;
+		vec<stmt_vec_info> roots = vNULL;
+		vec<tree> remain = vNULL;
+		stmts.create (1);
+		stmts.quick_push (vect_stmt_to_vectorize (stmt_info));
+		vect_build_slp_instance (vinfo,
+					 slp_inst_kind_reduc_group,
+					 stmts, roots, remain,
+					 max_tree_size, &limit,
+					 bst_map, NULL);
+	      }
+	  }
     }
 
   hash_set<slp_tree> visited_patterns;