diff --git a/gcc/testsuite/gcc.dg/vect/pr113371.c b/gcc/testsuite/gcc.dg/vect/pr113371.c new file mode 100644 index 0000000000000000000000000000000000000000..46c4deb0db90b457fef71ad177c6461fbdf74862 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr113371.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-O" } */ +/* { dg-additional-options "-march=silvermont" { target { x86_64-*-* i?86-*-* } } } */ + +long *BN_uadd_ap; + +void +BN_uadd (int dif, long t1) +{ + long *rp; + while (dif) + { + dif--; + t1 = *BN_uadd_ap; + *rp++ = t1; + if (t1) + break; + } +} diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc index 5e86da394680956ee5140f01be72a203cba9ebee..0495842b35050d024018c08a150d04a6dce0a86d 100644 --- a/gcc/tree-vect-data-refs.cc +++ b/gcc/tree-vect-data-refs.cc @@ -2354,8 +2354,9 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) /* Check if we can possibly peel the loop. */ if (!vect_can_advance_ivs_p (loop_vinfo) || !slpeel_can_duplicate_loop_p (loop, LOOP_VINFO_IV_EXIT (loop_vinfo), - LOOP_VINFO_IV_EXIT (loop_vinfo)) - || loop->inner) + loop_preheader_edge (loop)) + || loop->inner + || LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo)) do_peeling = false; struct _vect_peel_extended_info peel_for_known_alignment; diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index c7e73f65155930fae2713d410f179616b3e12388..8aa9224e1a98b718b899a5d408e94a457dd42acf 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -3262,7 +3262,8 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, { e = loop_preheader_edge (loop); edge exit_e = LOOP_VINFO_IV_EXIT (loop_vinfo); - gcc_checking_assert (slpeel_can_duplicate_loop_p (loop, exit_e, e)); + gcc_checking_assert (slpeel_can_duplicate_loop_p (loop, exit_e, e) + && !LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo)); /* Peel prolog and put it on preheader edge of loop. */ edge scalar_e = LOOP_VINFO_SCALAR_IV_EXIT (loop_vinfo);