This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR45948: Handle COND_EXPR in expression_expensive_p.


Hi,

this patch makes SCEV const propagation handle COND_EXPRs: previously
they were considered expensive to generate, and now we look at its
operands to decide if it is expensive.

I am testing this on amd64-linux.  Ok for trunk after test?

Thanks,
Sebastian

2010-12-02  Sebastian Pop  <sebastian.pop@amd.com>

	PR middle-end/45948
	* tree-scalar-evolution.c (expression_expensive_p): Handle COND_EXPR.

	* gcc.dg/tree-ssa/ldist-pr45948.c: New.
---
 gcc/ChangeLog                                 |    5 +++++
 gcc/testsuite/ChangeLog                       |    5 +++++
 gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c |   23 +++++++++++++++++++++++
 gcc/tree-scalar-evolution.c                   |    6 ++++++
 4 files changed, 39 insertions(+), 0 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index da56fb6..7502bc5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
 2010-12-02  Sebastian Pop  <sebastian.pop@amd.com>
 
+	PR middle-end/45948
+	* tree-scalar-evolution.c (expression_expensive_p): Handle COND_EXPR.
+
+2010-12-02  Sebastian Pop  <sebastian.pop@amd.com>
+
 	PR middle-end/45297
 	* tree-scalar-evolution.c (interpret_rhs_expr): Handle ADDR_EXPR
 	with MEM_REFs as POINTER_PLUS_EXPR.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3eeee83..43b1ae5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
 2010-12-02  Sebastian Pop  <sebastian.pop@amd.com>
 
+	PR middle-end/45948
+	* gcc.dg/tree-ssa/ldist-pr45948.c: New.
+
+2010-12-02  Sebastian Pop  <sebastian.pop@amd.com>
+
 	PR tree-optimization/45199
 	* gcc.dg/tree-ssa/ldist-15.c: New.
 	* gcc.dg/tree-ssa/ldist-16.c: New.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c
new file mode 100644
index 0000000..f0d07cc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */
+
+extern void bar(int);
+
+void
+foo (int i, int n)
+{
+  int a[30];
+  int b[30];
+  for (; i < n; i++)
+    a[i] = b[i] = 0;
+
+  while (1)
+    if (b[0])
+      bar (a[i - 1]);
+}
+
+/* We should apply loop distribution and generate 2 memset (0).  */
+
+/* { dg-final { scan-tree-dump "distributed: split to 2" "ldist" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_memset" 4 "ldist" } } */
+/* { dg-final { cleanup-tree-dump "ldist" } } */
diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c
index 4a4bda9..ab21092 100644
--- a/gcc/tree-scalar-evolution.c
+++ b/gcc/tree-scalar-evolution.c
@@ -3253,6 +3253,12 @@ expression_expensive_p (tree expr)
     return false;
 
   code = TREE_CODE (expr);
+
+  if (code == COND_EXPR)
+    return expression_expensive_p (TREE_OPERAND (expr, 0))
+      || expression_expensive_p (TREE_OPERAND (expr, 1))
+      || expression_expensive_p (TREE_OPERAND (expr, 2));
+
   if (code == TRUNC_DIV_EXPR
       || code == CEIL_DIV_EXPR
       || code == FLOOR_DIV_EXPR
-- 
1.7.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]