]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Handle unused-only-live stmts in SLP discovery
authorRichard Biener <rguenther@suse.de>
Thu, 7 Mar 2024 14:13:33 +0000 (15:13 +0100)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 5 Sep 2024 07:28:17 +0000 (09:28 +0200)
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

* tree-vect-slp.cc (vect_analyze_slp): Analyze SLP for live
but otherwise unused defs.

gcc/tree-vect-slp.cc

index d35e06091745448a0241c5ec78cffe73b1afabbf..b6839c7707b70d040a7d8b5918475773b9dbff0d 100644 (file)
@@ -4681,6 +4681,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;