This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
RE: [Patch PR 45241]: CPU2006 465.tonto ICE in the vectorizer with -fno-tree-pre
Hi, Ira:
Thanks for your reviews. Attached is the updated patch.
It passed bootstrapping on x86_64-unknown-linux-gnu and
the gcc regression tests (fixed PR 45241).
Since bug 45241 is a [4.5/4.6] regression, is it ok to
commit to 4.5 branch and 4.6 trunk?
Thanks,
Changpeng
________________________________________
From: Ira Rosen [IRAR@il.ibm.com]
Sent: Thursday, August 12, 2010 1:13 AM
To: Fang, Changpeng
Cc: gcc-patches@gcc.gnu.org
Subject: Re: [Patch PR 45241]: CPU2006 465.tonto ICE in the vectorizer with -fno-tree-pre
"Fang, Changpeng" <Changpeng.Fang@amd.com> wrote on 11/08/2010 08:36:42 PM:
> Hi,
>
> Attached patch fixes bug 45241: CPU2006 465.tonto ICE in the
> vectorizer with -fno-tree-pre.
>
> When the vectorizer tries to recognize the dot_prod pattern, it
> traces the statements chain
> outside the loop. As a result, ICE occurs when it tries to access
> the stmt_vinfo for a stmt
> outside the loop.
>
> This patch stops the pattern searching when the statement is already
> outside the loop.
> It passed bootstrapping in both the trunk and 4.5 branch.
On which target? What about regtesting?
>
> The bug is 4.5/4.6 regression, and it prevents benchmarking for
> cpu2006 with no PRE.
>
> Is it OK to commit to 4,5 branch (and 4.6 ?
>
> Thanks,
>
> Changpeng
>
* gcc/tree-vect-patterns.c (vect_recog_dot_prod_pattern): Give
No need in gcc/ before tree-vect-patterns.c.
up dor_prod pattern searching if a stmt is outside the loop.
dot prod
* gcc.dg/vect/pr45241.c: New.
---
gcc/testsuite/gcc.dg/vect/pr45241.c | 19 +++++++++++++++++++
gcc/tree-vect-patterns.c | 5 +++++
2 files changed, 24 insertions(+), 0 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/vect/pr45241.c
diff --git a/gcc/testsuite/gcc.dg/vect/pr45241.c
b/gcc/testsuite/gcc.dg/vect/pr45241.c
new file mode 100644
index 0000000..c04cf04
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr45241.c
@@ -0,0 +1,19 @@
+/* PR tree-optimization/45241 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -ftree-pre" } */
Instead of using dg-options please change the name of the test to
no-tree-pre-pr45241.c.
+
+int
+foo (short x)
+{
+ short i, y;
+ int sum;
+
+ for (i = 0; i < x; i++)
+ y = x * i;
+
+ for (i = x; i > 0; i--)
+ sum += y;
+
+ return sum;
+}
+
Please add
/* { dg-final { cleanup-tree-dump "vect" } } */
to the test.
Thanks,
Ira
From 075b88a514233e5c0ff877ddb27e756641b330d1 Mon Sep 17 00:00:00 2001
From: Changpeng Fang <chfang@houghton.(none)>
Date: Thu, 12 Aug 2010 10:08:54 -0700
Subject: [PATCH] pr45241 give up dot_prod pattern searching if stmt is outside the loop.
* tree-vect-patterns.c (vect_recog_dot_prod_pattern): Give
up dot_prod pattern searching if a stmt is outside the loop.
* gcc.dg/vect/no-tree-pre-pr45241.c: New.
---
gcc/testsuite/gcc.dg/vect/no-tree-pre-pr45241.c | 20 ++++++++++++++++++++
gcc/tree-vect-patterns.c | 5 +++++
2 files changed, 25 insertions(+), 0 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/vect/no-tree-pre-pr45241.c
diff --git a/gcc/testsuite/gcc.dg/vect/no-tree-pre-pr45241.c b/gcc/testsuite/gcc.dg/vect/no-tree-pre-pr45241.c
new file mode 100644
index 0000000..7a4ad9d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/no-tree-pre-pr45241.c
@@ -0,0 +1,20 @@
+/* PR tree-optimization/45241 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-tree-pre" } */
+
+int
+foo (short x)
+{
+ short i, y;
+ int sum;
+
+ for (i = 0; i < x; i++)
+ y = x * i;
+
+ for (i = x; i > 0; i--)
+ sum += y;
+
+ return sum;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
index 19f0ae6..19df13f 100644
--- a/gcc/tree-vect-patterns.c
+++ b/gcc/tree-vect-patterns.c
@@ -255,6 +255,11 @@ vect_recog_dot_prod_pattern (gimple last_stmt, tree *type_in, tree *type_out)
prod_type = half_type;
stmt = SSA_NAME_DEF_STMT (oprnd0);
+
+ /* It could not be the dot_prod pattern if the stmt is outside the loop. */
+ if (!flow_bb_inside_loop_p (loop, gimple_bb (stmt)))
+ return NULL;
+
/* FORNOW. Can continue analyzing the def-use chain when this stmt in a phi
inside the loop (in case we are analyzing an outer-loop). */
if (!is_gimple_assign (stmt))
--
1.6.3.3