+2019-11-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ * tree-vectorizer.h (vect_apply_runtime_profitability_check_p):
+ New function.
+ * tree-vect-loop-manip.c (vect_loop_versioning): Use it.
+ * tree-vect-loop.c (vect_analyze_loop_2): Likewise.
+ (vect_transform_loop): Likewise.
+ (vect_analyze_loop_costing): Don't take the cost of versioning
+ into account for the static profitability threshold if it turns
+ out that no versioning is needed.
+
2019-11-13 Jan Hubicka <hubicka@ucw.cz>
* ipa.c (cgraph_build_static_cdtor): Pass optimization_default_node
= LOOP_REQUIRES_VERSIONING_FOR_SIMD_IF_COND (loop_vinfo);
unsigned th = LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo);
- if (th >= vect_vf_for_cost (loop_vinfo)
- && !LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
+ if (vect_apply_runtime_profitability_check_p (loop_vinfo)
&& !ordered_p (th, versioning_threshold))
cond_expr = fold_build2 (GE_EXPR, boolean_type_node, scalar_loop_iters,
build_int_cst (TREE_TYPE (scalar_loop_iters),
return 0;
}
+ /* The static profitablity threshold min_profitable_estimate includes
+ the cost of having to check at runtime whether the scalar loop
+ should be used instead. If it turns out that we don't need or want
+ such a check, the threshold we should use for the static estimate
+ is simply the point at which the vector loop becomes more profitable
+ than the scalar loop. */
+ if (min_profitable_estimate > min_profitable_iters
+ && !LOOP_REQUIRES_VERSIONING (loop_vinfo)
+ && !LOOP_VINFO_PEELING_FOR_NITER (loop_vinfo)
+ && !LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo)
+ && !vect_apply_runtime_profitability_check_p (loop_vinfo))
+ {
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_NOTE, vect_location, "no need for a runtime"
+ " choice between the scalar and vector loops\n");
+ min_profitable_estimate = min_profitable_iters;
+ }
+
HOST_WIDE_INT estimated_niter;
/* If we are vectorizing an epilogue then we know the maximum number of
/* Use the same condition as vect_transform_loop to decide when to use
the cost to determine a versioning threshold. */
- if (th >= vect_vf_for_cost (loop_vinfo)
- && !LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
+ if (vect_apply_runtime_profitability_check_p (loop_vinfo)
&& ordered_p (th, niters_th))
niters_th = ordered_max (poly_uint64 (th), niters_th);
run at least the (estimated) vectorization factor number of times
checking is pointless, too. */
th = LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo);
- if (th >= vect_vf_for_cost (loop_vinfo)
- && !LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
+ if (vect_apply_runtime_profitability_check_p (loop_vinfo))
{
- if (dump_enabled_p ())
- dump_printf_loc (MSG_NOTE, vect_location,
- "Profitability threshold is %d loop iterations.\n",
- th);
- check_profitability = true;
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_NOTE, vect_location,
+ "Profitability threshold is %d loop iterations.\n",
+ th);
+ check_profitability = true;
}
/* Make sure there exists a single-predecessor exit bb. Do this before
return tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (dr_info->dr))));
}
+/* Return true if LOOP_VINFO requires a runtime check for whether the
+ vector loop is profitable. */
+
+inline bool
+vect_apply_runtime_profitability_check_p (loop_vec_info loop_vinfo)
+{
+ unsigned int th = LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo);
+ return (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
+ && th >= vect_vf_for_cost (loop_vinfo));
+}
+
/* Source location + hotness information. */
extern dump_user_location_t vect_location;