{
dr_vec_info *dr_info = LOOP_VINFO_UNALIGNED_DR (loop_vinfo);
tree var;
- tree niters_type = TREE_TYPE (LOOP_VINFO_NITERS (loop_vinfo));
+ tree niters_type
+ = LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo) ? sizetype
+ : TREE_TYPE (LOOP_VINFO_NITERS
+ (loop_vinfo));
gimple_seq stmts = NULL, new_stmts = NULL;
tree iters, iters_name;
stmt_vec_info stmt_info = dr_info->stmt;
tree
vect_build_loop_niters (loop_vec_info loop_vinfo, bool *new_var_p)
{
+ if (LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo))
+ return NULL_TREE;
tree ni = unshare_expr (LOOP_VINFO_NITERS (loop_vinfo));
if (TREE_CODE (ni) == INTEGER_CST)
return ni;
bool niters_no_overflow)
{
tree ni_minus_gap, var;
- tree niters_vector, step_vector, type = TREE_TYPE (niters);
+ tree niters_vector, step_vector;
+ tree type = niters ? TREE_TYPE (niters) : sizetype;
poly_uint64 vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
edge pe = loop_preheader_edge (LOOP_VINFO_LOOP (loop_vinfo));
tree *advance)
{
edge e, guard_e;
- tree type = TREE_TYPE (niters), guard_cond;
+ tree type = niters ? TREE_TYPE (niters) : sizetype;
+ tree guard_cond;
basic_block guard_bb, guard_to;
profile_probability prob_prolog, prob_vector, prob_epilog;
int estimated_vf;
/* Get the maximum number of iterations that is representable
in the counter type. */
- tree ni_type = TREE_TYPE (LOOP_VINFO_NITERSM1 (loop_vinfo));
+ tree ni_type;
+ if (!LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo))
+ ni_type = TREE_TYPE (LOOP_VINFO_NITERSM1 (loop_vinfo));
+ else
+ ni_type = sizetype;
widest_int max_ni = wi::to_widest (TYPE_MAX_VALUE (ni_type)) + 1;
/* Get a more refined estimate for the number of iterations. */
static bool
loop_niters_no_overflow (loop_vec_info loop_vinfo)
{
+ gcc_assert (!LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo));
+
/* Constant case. */
if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
{
bool check_profitability = false;
unsigned int th;
bool flat = maybe_flat_loop_profile (loop);
+ bool uncounted_p = LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo);
DUMP_VECT_SCOPE ("vec_transform_loop");
tree niters = vect_build_loop_niters (loop_vinfo);
LOOP_VINFO_NITERS_UNCHANGED (loop_vinfo) = niters;
tree nitersm1 = unshare_expr (LOOP_VINFO_NITERSM1 (loop_vinfo));
- bool niters_no_overflow = loop_niters_no_overflow (loop_vinfo);
tree advance;
drs_init_vec orig_drs_init;
+ bool niters_no_overflow = uncounted_p ? false /* Not known. */
+ : loop_niters_no_overflow (loop_vinfo);
epilogue = vect_do_peeling (loop_vinfo, niters, nitersm1, &niters_vector,
&step_vector, &niters_vector_mult_vf, th,
#define LOOP_VINFO_NBBS(L) (L)->nbbs
#define LOOP_VINFO_NITERSM1(L) (L)->num_itersm1
#define LOOP_VINFO_NITERS(L) (L)->num_iters
+#define LOOP_VINFO_NITERS_UNCOUNTED_P(L) (LOOP_VINFO_NITERS (L) \
+ == chrec_dont_know)
/* Since LOOP_VINFO_NITERS and LOOP_VINFO_NITERSM1 can change after
prologue peeling retain total unchanged scalar loop iterations for
cost model. */