re PR tree-optimization/63962 ([x86] Code pessimization after r217213)
authorRichard Biener <rguenther@suse.de>
Thu, 20 Nov 2014 09:26:48 +0000 (09:26 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 20 Nov 2014 09:26:48 +0000 (09:26 +0000)
2014-11-20  Richard Biener  <rguenther@suse.de>

PR middle-end/63962
* match.pd ((p +p off1) +p off2 -> (p +p (off1 + off2))):
Guard with single-use operand 0.

* gcc.dg/tree-ssa/forwprop-30.c: New testcase.

From-SVN: r217828

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/forwprop-30.c [new file with mode: 0644]

index 56668b06272e3809be664ad1697d6bfb8a43efdf..2a4d0099884f5f65add01321f13ee3060791c414 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-20  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/63962
+       * match.pd ((p +p off1) +p off2 -> (p +p (off1 + off2))):
+       Guard with single-use operand 0.
+
 2014-11-20   Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/63677
index 1f204716d1cda47115eb566bef40ba331fd7633f..01f610c6b6f3e69be24d767d39611b39e0e1d679 100644 (file)
@@ -370,8 +370,9 @@ along with GCC; see the file COPYING3.  If not see
 
 /* Associate (p +p off1) +p off2 as (p +p (off1 + off2)).  */
 (simplify
-  (pointer_plus (pointer_plus @0 @1) @3)
-  (pointer_plus @0 (plus @1 @3)))
+  (pointer_plus (pointer_plus@2 @0 @1) @3)
+  (if (TREE_CODE (@2) != SSA_NAME || has_single_use (@2))
+   (pointer_plus @0 (plus @1 @3))))
 
 /* Pattern match
      tem1 = (long) ptr1;
index 2e637f0c81a6bf7bccb7f713175e1467e668abe2..853a83b52bcb6096141427ec53cf9b84c54ac22c 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-20  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/63962
+       * gcc.dg/tree-ssa/forwprop-30.c: New testcase.
+
 2014-11-20   Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/63677
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-30.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-30.c
new file mode 100644 (file)
index 0000000..96554f2
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+int *p;
+int *foo (int *q, int i, int j)
+{
+  p = q + i;
+  return p + j;
+}
+
+/* We shouldn't associate (q + i) + j to q + (i + j) here as we
+   need q + i as well.  */
+
+/* { dg-final { scan-tree-dump-times "\\+" 2 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */