+2015-11-09 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/56118
+ * tree-vectorizer.h (vect_find_last_scalar_stmt_in_slp): Declare.
+ * tree-vect-slp.c (vect_find_last_scalar_stmt_in_slp): Export.
+ * tree-vect-data-refs.c (vect_slp_analyze_node_dependences): New
+ function.
+ (vect_slp_analyze_data_ref_dependences): Instead of computing
+ all dependences of the region DRs just analyze the code motions
+ SLP vectorization will perform. Remove SLP instances that
+ cannot have their store/load motions applied.
+ (vect_analyze_data_refs): Allow DRs without a vectype
+ in BB vectorization.
+
2015-11-09 Julian Brown <julian@codesourcery.com>
* final.c (output_asm_insn): Pass VOIDmode to output_address.
}
+/* Analyze dependences involved in the transform of SLP NODE. */
+
+static bool
+vect_slp_analyze_node_dependences (slp_instance instance, slp_tree node)
+{
+ /* This walks over all stmts involved in the SLP load/store done
+ in NODE verifying we can sink them up to the last stmt in the
+ group. */
+ gimple *last_access = vect_find_last_scalar_stmt_in_slp (node);
+ for (unsigned k = 0; k < SLP_INSTANCE_GROUP_SIZE (instance); ++k)
+ {
+ gimple *access = SLP_TREE_SCALAR_STMTS (node)[k];
+ if (access == last_access)
+ continue;
+ stmt_vec_info access_stmt_info = vinfo_for_stmt (access);
+ gimple_stmt_iterator gsi = gsi_for_stmt (access);
+ gsi_next (&gsi);
+ for (; gsi_stmt (gsi) != last_access; gsi_next (&gsi))
+ {
+ gimple *stmt = gsi_stmt (gsi);
+ stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
+ if (!STMT_VINFO_DATA_REF (stmt_info)
+ || (DR_IS_READ (STMT_VINFO_DATA_REF (stmt_info))
+ && DR_IS_READ (STMT_VINFO_DATA_REF (access_stmt_info))))
+ continue;
+
+ ddr_p ddr = initialize_data_dependence_relation
+ (STMT_VINFO_DATA_REF (access_stmt_info),
+ STMT_VINFO_DATA_REF (stmt_info), vNULL);
+ if (vect_slp_analyze_data_ref_dependence (ddr))
+ {
+ /* ??? If the dependence analysis failed we can resort to the
+ alias oracle which can handle more kinds of stmts. */
+ free_dependence_relation (ddr);
+ return false;
+ }
+ free_dependence_relation (ddr);
+ }
+ }
+ return true;
+}
+
+
/* Function vect_analyze_data_ref_dependences.
Examine all the data references in the basic-block, and make sure there
bool
vect_slp_analyze_data_ref_dependences (bb_vec_info bb_vinfo)
{
- struct data_dependence_relation *ddr;
- unsigned int i;
-
if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location,
"=== vect_slp_analyze_data_ref_dependences ===\n");
- if (!compute_all_dependences (BB_VINFO_DATAREFS (bb_vinfo),
- &BB_VINFO_DDRS (bb_vinfo),
- vNULL, true))
- return false;
+ slp_instance instance;
+ slp_tree load;
+ unsigned int i, j;
+ for (i = 0; BB_VINFO_SLP_INSTANCES (bb_vinfo).iterate (i, &instance); )
+ {
+ bool remove = false;
+ /* Verify we can sink loads to the vectorized stmt insert location. */
+ FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (instance), j, load)
+ if (! vect_slp_analyze_node_dependences (instance, load))
+ {
+ remove = true;
+ break;
+ }
+ /* Verify we can sink stores to the vectorized stmt insert location. */
+ slp_tree store = SLP_INSTANCE_TREE (instance);
+ if (!remove
+ && STMT_VINFO_DATA_REF
+ (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (store)[0]))
+ && ! vect_slp_analyze_node_dependences (instance, store))
+ remove = true;
+ if (remove)
+ {
+ dump_printf_loc (MSG_NOTE, vect_location,
+ "removing SLP instance operations starting from: ");
+ dump_gimple_stmt (MSG_NOTE, TDF_SLIM,
+ SLP_TREE_SCALAR_STMTS
+ (SLP_INSTANCE_TREE (instance))[0], 0);
+ vect_free_slp_instance (instance);
+ BB_VINFO_SLP_INSTANCES (bb_vinfo).ordered_remove (i);
+ }
+ i++;
+ }
- FOR_EACH_VEC_ELT (BB_VINFO_DDRS (bb_vinfo), i, ddr)
- if (vect_slp_analyze_data_ref_dependence (ddr))
- return false;
+ if (!BB_VINFO_SLP_INSTANCES (bb_vinfo).length ())
+ return false;
return true;
}
}
if (is_a <bb_vec_info> (vinfo))
- break;
+ {
+ /* No vector type is fine, the ref can still participate
+ in dependence analysis, we just can't vectorize it. */
+ STMT_VINFO_VECTORIZABLE (stmt_info) = false;
+ continue;
+ }
if (gatherscatter != SG_NONE || simd_lane_access)
{