https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110571

            Bug ID: 110571
           Summary: vect_determine_partial_vectors_and_peeling required at
                    vect_do_peeling time
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
  Target Milestone: ---

When one removes the seemingly no-op call of
vect_determine_partial_vectors_and_peeling in vect_do_peeling you run into
execute FAILs of for example gcc.dg/vect/vect-peel-1-epilogue.c because
that call does

  LOOP_VINFO_PEELING_FOR_NITER (loop_vinfo)
    = (!LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo)
       && need_peeling_or_partial_vectors_p);

which due to vect_need_peeling_or_partial_vectors_p looking at
LOOP_VINFO_INT_NITERS needs to behave differently for the case of
the known number of iterations when falling through from the vector
loop as opposed to when coming around the skip edge.

The caller in vect_do_peeling immediately before adjusts niter:

      /* Subtract the number of iterations performed by the vectorized loop
         from the number of total iterations.  */
      tree epilogue_niters = fold_build2 (MINUS_EXPR, TREE_TYPE (niters),
                                          before_loop_niters,
                                          niters);

      LOOP_VINFO_NITERS (epilogue_vinfo) = epilogue_niters;
      LOOP_VINFO_NITERSM1 (epilogue_vinfo)
        = fold_build2 (MINUS_EXPR, TREE_TYPE (epilogue_niters),
                       epilogue_niters,
                       build_one_cst (TREE_TYPE (epilogue_niters)));

and then gets the correct answer.

The LOOP_VINFO_NITERS is arguably wrong during most parts of the re-analysis
of the loop as epilogue leading to these kind of issues.

While I think we apply peeling for alignment before going the skip edge way
there is LOOP_VINFO_PEELING_FOR_GAPS which can differ between main and
epilogue.  I think we need to know whether we are going to have a skip
edge or not and compute vect_need_peeling_or_partial_vectors_p for the
epilog for both niter kinds.

It's arguably main loop analysis that should compute a (bound) for the
epilogue number of iterations.

Reply via email to