aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-02-10 11:48:47 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-02-10 11:48:47 +0000
commit696814edb80cfae8840213cf3e3100d0265944bd (patch)
tree23cfbb89274e498a827a4e773622710dfa8b4ded /gcc
parent644a47612e7b5919bb36df5d6c0b28992d99ce5f (diff)
downloadgcc-696814edb80cfae8840213cf3e3100d0265944bd.zip
gcc-696814edb80cfae8840213cf3e3100d0265944bd.tar.gz
gcc-696814edb80cfae8840213cf3e3100d0265944bd.tar.bz2
re PR tree-optimization/64909 (Missed vectorization with bdver1)
2015-02-10 Richard Biener <rguenther@suse.de> PR tree-optimization/64909 * tree-vect-loop.c (vect_estimate_min_profitable_iters): Properly pass a scalar-stmt count estimate to the cost model. * tree-vect-data-refs.c (vect_peeling_hash_get_lowest_cost): Likewise. * gcc.dg/vect/costmodel/x86_64/costmodel-pr64909.c: New testcase. From-SVN: r220580
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr64909.c15
-rw-r--r--gcc/tree-vect-data-refs.c11
-rw-r--r--gcc/tree-vect-loop.c11
5 files changed, 42 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 888ceb4..7f3816c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2015-02-10 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/64909
+ * tree-vect-loop.c (vect_estimate_min_profitable_iters): Properly
+ pass a scalar-stmt count estimate to the cost model.
+ * tree-vect-data-refs.c (vect_peeling_hash_get_lowest_cost): Likewise.
+
2015-02-10 Alexander Monakov <amonakov@ispras.ru>
* doc/invoke.texi (-fvar-tracking-assignments): Clarify that VTA is
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9bb681c..15d5e2d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-02-10 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/64909
+ * gcc.dg/vect/costmodel/x86_64/costmodel-pr64909.c: New testcase.
+
2015-02-10 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* gcc.dg/signbit-sa.c: New test.
diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr64909.c b/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr64909.c
new file mode 100644
index 0000000..0f9feac
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr64909.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-mtune=bdver1" } */
+
+unsigned short a[32];
+unsigned int b[32];
+void t()
+{
+ int i;
+ for (i=0;i<12;i++)
+ b[i]=a[i];
+}
+
+/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 302f2df..2c74060 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -1184,10 +1184,13 @@ vect_peeling_hash_get_lowest_cost (_vect_peel_info **slot,
}
single_iter_cost = vect_get_single_scalar_iteration_cost (loop_vinfo);
- outside_cost += vect_get_known_peeling_cost (loop_vinfo, elem->npeel,
- &dummy, single_iter_cost,
- &prologue_cost_vec,
- &epilogue_cost_vec);
+ outside_cost += vect_get_known_peeling_cost
+ (loop_vinfo, elem->npeel, &dummy,
+ /* ??? We use this cost as number of stmts with scalar_stmt cost,
+ thus divide by that. This introduces rounding errors, thus better
+ introduce a new cost kind (raw_cost? scalar_iter_cost?). */
+ single_iter_cost / vect_get_stmt_cost (scalar_stmt),
+ &prologue_cost_vec, &epilogue_cost_vec);
/* Prologue and epilogue costs are added to the target model later.
These costs depend only on the scalar iteration cost, the
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index c5f1c29..3e7c701 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -2834,6 +2834,11 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
statements. */
scalar_single_iter_cost = vect_get_single_scalar_iteration_cost (loop_vinfo);
+ /* ??? Below we use this cost as number of stmts with scalar_stmt cost,
+ thus divide by that. This introduces rounding errors, thus better
+ introduce a new cost kind (raw_cost? scalar_iter_cost?). */
+ int scalar_single_iter_stmts
+ = scalar_single_iter_cost / vect_get_stmt_cost (scalar_stmt);
/* Add additional cost for the peeled instructions in prologue and epilogue
loop.
@@ -2868,10 +2873,10 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
/* FORNOW: Don't attempt to pass individual scalar instructions to
the model; just assume linear cost for scalar iterations. */
(void) add_stmt_cost (target_cost_data,
- peel_iters_prologue * scalar_single_iter_cost,
+ peel_iters_prologue * scalar_single_iter_stmts,
scalar_stmt, NULL, 0, vect_prologue);
(void) add_stmt_cost (target_cost_data,
- peel_iters_epilogue * scalar_single_iter_cost,
+ peel_iters_epilogue * scalar_single_iter_stmts,
scalar_stmt, NULL, 0, vect_epilogue);
}
else
@@ -2887,7 +2892,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
(void) vect_get_known_peeling_cost (loop_vinfo, peel_iters_prologue,
&peel_iters_epilogue,
- scalar_single_iter_cost,
+ scalar_single_iter_stmts,
&prologue_cost_vec,
&epilogue_cost_vec);