diff --git a/gcc/testsuite/gcc.dg/vect/vect-cond-11.c b/gcc/testsuite/gcc.dg/vect/vect-cond-11.c index 38f1f8f50901c3039d0e7cb17d1bd47b18b89c71..b1347bddbd57ab75bf2be8073c2868a88c48e5ca 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-cond-11.c +++ b/gcc/testsuite/gcc.dg/vect/vect-cond-11.c @@ -1,3 +1,4 @@ +/* { dg-additional-options "-fdump-tree-optimized-details-blocks" } */ #include "tree-vect.h" #define N 1024 @@ -116,3 +117,4 @@ main () return 0; } +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-extern-1.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-extern-1.c index 2ac3be0c242832f78e11da504c0537100d3460a9..2df3c8f1cf12efaaa3351514e4fcd8ccb505f3bd 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-extern-1.c +++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-extern-1.c @@ -1,3 +1,4 @@ +/* { dg-additional-options "-fdump-tree-optimized-details-blocks" } */ /* { dg-do compile } */ #define N 1024 @@ -13,3 +14,4 @@ f (unsigned int *x1, unsigned int *x2, unsigned short *y, unsigned char z) x2[i] += 1; } } +/* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */ diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index 0e7e223f22a3ea3055caf830a0b74898b54b54ae..09641901ff1e5c03dd07ab6f85dd67288f940ea2 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -3933,9 +3933,15 @@ vect_loop_versioning (loop_vec_info loop_vinfo, te->probability = prob; fe->probability = prob.invert (); /* We can scale loops counts immediately but have to postpone - scaling the scalar loop because we re-use it during peeling. */ - scale_loop_frequencies (loop_to_version, te->probability); - LOOP_VINFO_SCALAR_LOOP_SCALING (loop_vinfo) = fe->probability; + scaling the scalar loop because we re-use it during peeling. + + Ifcvt duplicates loop preheader, loop body and produces an basic + block after loop exit. We need to scale all that. */ + basic_block preheader = loop_preheader_edge (loop_to_version)->src; + preheader->count = preheader->count.apply_probability (prob * prob2); + scale_loop_frequencies (loop_to_version, prob * prob2); + single_exit (loop_to_version)->dest->count = preheader->count; + LOOP_VINFO_SCALAR_LOOP_SCALING (loop_vinfo) = (prob * prob2).invert (); nloop = scalar_loop; if (dump_enabled_p ()) @@ -4069,6 +4075,8 @@ vect_loop_versioning (loop_vec_info loop_vinfo, adj.safe_push (son); for (auto son : adj) set_immediate_dominator (CDI_DOMINATORS, son, e->src); + //debug_bb (condition_bb); + //debug_bb (e->src); } if (version_niter) diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index a83952aff60760c13f9c82dc710c9d2de32c32c8..00058c3c13e3fb7d8d9622e85ba5e2f4f819cb88 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -11318,8 +11318,19 @@ vect_transform_loop (loop_vec_info loop_vinfo, gimple *loop_vectorized_call) &advance); if (LOOP_VINFO_SCALAR_LOOP (loop_vinfo) && LOOP_VINFO_SCALAR_LOOP_SCALING (loop_vinfo).initialized_p ()) - scale_loop_frequencies (LOOP_VINFO_SCALAR_LOOP (loop_vinfo), - LOOP_VINFO_SCALAR_LOOP_SCALING (loop_vinfo)); + { + /* Ifcvt duplicates loop preheader, loop body and produces an basic + block after loop exit. We need to scale all that. */ + basic_block preheader + = loop_preheader_edge (LOOP_VINFO_SCALAR_LOOP (loop_vinfo))->src; + preheader->count + = preheader->count.apply_probability + (LOOP_VINFO_SCALAR_LOOP_SCALING (loop_vinfo)); + scale_loop_frequencies (LOOP_VINFO_SCALAR_LOOP (loop_vinfo), + LOOP_VINFO_SCALAR_LOOP_SCALING (loop_vinfo)); + single_exit (LOOP_VINFO_SCALAR_LOOP (loop_vinfo))->dest->count + = preheader->count; + } if (niters_vector == NULL_TREE) {