https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111820
--- Comment #7 from Hongtao.liu <crazylht at gmail dot com> --- (In reply to rguent...@suse.de from comment #6) > On Mon, 16 Oct 2023, crazylht at gmail dot com wrote: > > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111820 > > > > --- Comment #5 from Hongtao.liu <crazylht at gmail dot com> --- > > (In reply to Richard Biener from comment #3) > > > for (unsigned i = 0; i != skipn - 1; i++) > > > begin = wi::mul (begin, wi::to_wide (step_expr)); > > > > > > (gdb) p skipn > > > $5 = 4294967292 > > > > > > niters is 4294967292 in vect_update_ivs_after_vectorizer. Maybe the loop > > > should terminate when begin is zero. But I wonder why we pass in 'niters' > > Here, it want to calculate begin * pow (step_expr, skipn), yes we can just > > skip > > the loop when begin is 0. > > I mean terminate it when the multiplication overflowed to zero. for pow (3, skipn), it will never overflowed to zero. To solve this problem once and for all, I'm leaning towards setting a threshold in vect_can_peel_nonlinear_iv_p for vect_step_op_mul,if step_expr is not exact_log2() and niter > TYPE_PRECISION (step_expr) we give up on doing vectorization. > > As for the MASK_ thing the skip is to be interpreted negative (we > should either not use a 'tree' here or make it have the correct type > maybe). Can we even handle this here? It would need to be > a division, no? > > So I think we need to disable non-linear IV or masked peeling for > niter/aligment? But I wonder how we run into this with plain -O3. I think we already disabled negative niters_skip in vect_can_peel_nonlinear_iv_p. 416 /* Also doens't support peel for neg when niter is variable. 1417 ??? generate something like niter_expr & 1 ? init_expr : -init_expr? */ 1418 niters_skip = LOOP_VINFO_MASK_SKIP_NITERS (loop_vinfo); 1419 if ((niters_skip != NULL_TREE 1420 && TREE_CODE (niters_skip) != INTEGER_CST) 1421 || (!vect_use_loop_mask_for_alignment_p (loop_vinfo) 1422 && LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) < 0)) 1423 { 1424 if (dump_enabled_p ()) 1425 dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, 1426 "Peeling for alignement is not supported" 1427 " for nonlinear induction when niters_skip" 1428 " is not constant.\n"); 1429 return false; 1430 }