aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-cond-11.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-extern-1.c2
-rw-r--r--gcc/tree-vect-loop-manip.cc14
-rw-r--r--gcc/tree-vect-loop.cc15
4 files changed, 28 insertions, 5 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/vect-cond-11.c b/gcc/testsuite/gcc.dg/vect/vect-cond-11.c
index 38f1f8f..b1347bd 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 2ac3be0..2df3c8f 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 0e7e223..0964190 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 a83952a..00058c3 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)
{