re PR tree-optimization/64193 (Decreased performance after r173250)
authorRichard Biener <rguenther@suse.de>
Tue, 9 Dec 2014 14:25:09 +0000 (14:25 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 9 Dec 2014 14:25:09 +0000 (14:25 +0000)
2014-12-09  Richard Biener  <rguenther@suse.de>

PR tree-optimization/64193
* tree-ssa-alias.c (walk_non_aliased_vuses): Add valueize parameter
and valueize the VUSE before looking up the def stmt.
* tree-ssa-alias.h (walk_non_aliased_vuses): Adjust prototype.
* tree-ssa-sccvn.c (vn_reference_lookup_pieces): Pass vn_valueize
to walk_non_aliased_vuses.
(vn_reference_lookup): Likewise.
* tree-ssa-dom.c (lookup_avail_expr): Pass NULL as valueize
callback to walk_non_aliased_vuses.

* gcc.dg/tree-ssa/ssa-fre-43.c: New testcase.

From-SVN: r218515

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-43.c [new file with mode: 0644]
gcc/tree-ssa-alias.c
gcc/tree-ssa-alias.h
gcc/tree-ssa-dom.c
gcc/tree-ssa-sccvn.c

index 0997ef4f3128cd9bc9f67afeaf6d17a9c8bb9aaa..75312341824bf6297036e7d4d2563fb10d28f1d6 100644 (file)
@@ -1,3 +1,15 @@
+2014-12-09  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/64193
+       * tree-ssa-alias.c (walk_non_aliased_vuses): Add valueize parameter
+       and valueize the VUSE before looking up the def stmt.
+       * tree-ssa-alias.h (walk_non_aliased_vuses): Adjust prototype.
+       * tree-ssa-sccvn.c (vn_reference_lookup_pieces): Pass vn_valueize
+       to walk_non_aliased_vuses.
+       (vn_reference_lookup): Likewise.
+       * tree-ssa-dom.c (lookup_avail_expr): Pass NULL as valueize
+       callback to walk_non_aliased_vuses.
+
 2014-12-09  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/64199
index fbd11360617a6c04b534b3ce46e5aa95e3637c25..ed0315622f2e5993aa0ffe9fc7d9dfb9074217b7 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-09  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/64193
+       * gcc.dg/tree-ssa/ssa-fre-43.c: New testcase.
+
 2014-12-09  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/64199
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-43.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-43.c
new file mode 100644 (file)
index 0000000..e79e7c4
--- /dev/null
@@ -0,0 +1,29 @@
+/* PR tree-optimization/64193 */
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-fre1-details" } */
+
+double T,T2,E1[5];
+int J;
+
+void
+PA(double E[])
+{
+ J = 0;
+
+L10:
+ E[1] = ( E[1] + E[2] + E[3] - E[4]) * T;
+ E[2] = ( E[1] + E[2] - E[3] + E[4]) * T;
+ E[3] = ( E[1] - E[2] + E[3] + E[4]) * T;
+ E[4] = (-E[1] + E[2] + E[3] + E[4]) / T2;
+ J += 1;
+
+ if (J < 6)
+  goto L10;
+}
+
+/* We should remove 15 dead loads, fully propagating their replacements
+   with exactly 4 loads and 4 stores from/to E remaining.  */
+
+/* { dg-final { scan-tree-dump-times "Removing dead stmt" 15 "fre1" } } */
+/* { dg-final { scan-tree-dump-not "Not changing value number" "fre1" } } */
+/* { dg-final { cleanup-tree-dump "fre1" } } */
index 17e84149c7aa66adfa0eccf0367d3e21574f4e43..5ad257629204287dab61960acceac2229d0ff0d4 100644 (file)
@@ -2632,12 +2632,18 @@ get_continuation_for_phi (gimple phi, ao_ref *ref,
    If TRANSLATE returns NULL the walk continues and TRANSLATE is supposed
    to adjust REF and *DATA to make that valid.
 
+   VALUEIZE if non-NULL is called with the next VUSE that is considered
+   and return value is substituted for that.  This can be used to
+   implement optimistic value-numbering for example.  Note that the
+   VUSE argument is assumed to be valueized already.
+
    TODO: Cache the vector of equivalent vuses per ref, vuse pair.  */
 
 void *
 walk_non_aliased_vuses (ao_ref *ref, tree vuse,
                        void *(*walker)(ao_ref *, tree, unsigned int, void *),
                        void *(*translate)(ao_ref *, tree, void *, bool),
+                       tree (*valueize)(tree),
                        void *data)
 {
   bitmap visited = NULL;
@@ -2663,6 +2669,8 @@ walk_non_aliased_vuses (ao_ref *ref, tree vuse,
       else if (res != NULL)
        break;
 
+      if (valueize)
+       vuse = valueize (vuse);
       def_stmt = SSA_NAME_DEF_STMT (vuse);
       if (gimple_nop_p (def_stmt))
        break;
index 3193c64a38a260a719ed37fcbcdfd400ce85734d..ca6390a979384b64fff3bb915b12180621fe8f6a 100644 (file)
@@ -124,6 +124,7 @@ extern void *walk_non_aliased_vuses (ao_ref *, tree,
                                     void *(*)(ao_ref *, tree,
                                               unsigned int, void *),
                                     void *(*)(ao_ref *, tree, void *, bool),
+                                    tree (*)(tree),
                                     void *);
 extern unsigned int walk_aliased_vdefs (ao_ref *, tree,
                                        bool (*)(ao_ref *, tree, void *),
index 60be376e740b38754e9a89e5b7a86393ba3a6a51..bd37226c856a80acc941ef48fa8dc934e015c730 100644 (file)
@@ -2635,7 +2635,7 @@ lookup_avail_expr (gimple stmt, bool insert)
            && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
            && (ao_ref_init (&ref, gimple_assign_rhs1 (stmt)), true)
            && walk_non_aliased_vuses (&ref, vuse2,
-                                      vuse_eq, NULL, vuse1) != NULL))
+                                      vuse_eq, NULL, NULL, vuse1) != NULL))
        {
          struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt);
          *element2 = element;
index 7f6941527457451edfe4654920ce80675a2a4ba6..d7a4742caf6bd90d1e73181342e1dd06c90ed9c8 100644 (file)
@@ -2160,7 +2160,8 @@ vn_reference_lookup_pieces (tree vuse, alias_set_type set, tree type,
        *vnresult =
          (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse,
                                                  vn_reference_lookup_2,
-                                                 vn_reference_lookup_3, &vr1);
+                                                 vn_reference_lookup_3,
+                                                 vn_valueize, &vr1);
       gcc_checking_assert (vr1.operands == shared_lookup_references);
     }
 
@@ -2212,7 +2213,8 @@ vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind,
       wvnresult =
        (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse,
                                                vn_reference_lookup_2,
-                                               vn_reference_lookup_3, &vr1);
+                                               vn_reference_lookup_3,
+                                               vn_valueize, &vr1);
       gcc_checking_assert (vr1.operands == shared_lookup_references);
       if (wvnresult)
        {