Patchwork [PR,45241] : CPU2006 465.tonto ICE in the vectorizer with -fno-tree-pre

login
register
mail settings
Submitter Fang, Changpeng
Date Aug. 11, 2010, 5:36 p.m.
Message ID <D4C76825A6780047854A11E93CDE84D03F2850B2@SAUSEXMBP01.amd.com>
Download mbox | patch
Permalink /patch/61494/
State New
Headers show

Comments

Fang, Changpeng - Aug. 11, 2010, 5:36 p.m.
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.

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

Patch

From c13c752b77704e04b8285fb667d6f01f95352136 Mon Sep 17 00:00:00 2001
From: Changpeng Fang <chfang@houghton.(none)>
Date: Tue, 10 Aug 2010 15:31:20 -0700
Subject: [PATCH] pr45241 give up dot_prod pattern searching if stmt is outside the loop

	* gcc/tree-vect-patterns.c (vect_recog_dot_prod_pattern): Give
	up dor_prod pattern searching if a stmt is outside the loop.

	* 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" } */
+
+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;
+}
+
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