This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC] Improve tree DSE
Hi Richard,
>> Given the simple testcases you add I wonder if you want a cheaper
>> implementation,
>> namely check that when reaching a loop PHI the only aliasing stmt in
>> its use-chain
>> is the use_stmt you reached the PHI from. That would avoid this and the tests
>> for the store being redundant and simplify the patch considerably.
Tried implementing above in the attached patch. Bootstrapped on
x86_64-linux-gnu. Full testing is ongoing.
Thanks,
Kugan
gcc/ChangeLog:
2018-05-14 Kugan Vivekanandarajah <kuganv@linaro.org>
* tree-ssa-dse.c (phi_aliases_stmt_only): New.
(dse_classify_store): Use phi_aliases_stmt_only.
gcc/testsuite/ChangeLog:
2018-05-14 Kugan Vivekanandarajah <kuganv@linaro.org>
* gcc.dg/tree-ssa/ssa-dse-31.c: New test.
* gcc.dg/tree-ssa/ssa-dse-32.c: New test.
From 102b1dd676446055fb881daa1fee4e96b6fe676d Mon Sep 17 00:00:00 2001
From: Kugan Vivekanandarajah <kugan.vivekanandarajah@linaro.org>
Date: Wed, 9 May 2018 08:57:23 +1000
Subject: [PATCH] improve dse Change-Id:
If23529a3ede8230b26de8d60c1e0c5141be8edb7
---
gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-31.c | 16 +++++++++++++++
gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-32.c | 23 +++++++++++++++++++++
gcc/tree-ssa-dse.c | 33 +++++++++++++++++++++++++++---
3 files changed, 69 insertions(+), 3 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-31.c
create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-32.c
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-31.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-31.c
new file mode 100644
index 0000000..e4d71b2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-31.c
@@ -0,0 +1,16 @@
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-dse-details" } */
+#define SIZE 4
+
+int main ()
+{
+ static float a[SIZE];
+ int i;
+ for (i = 0; i < SIZE; i++)
+ __builtin_memset ((void *) a, 0, sizeof(float)*3);
+ __builtin_memset ((void *) a, 0, sizeof(float)*SIZE);
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "Deleted dead calls" 1 "dse1"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-32.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-32.c
new file mode 100644
index 0000000..3d8fd5f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-32.c
@@ -0,0 +1,23 @@
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-dse-details" } */
+#define SIZE 4
+
+void s4 (float *restrict a)
+{
+ (void) __builtin_memset ((void *) a, 0, sizeof(float)*SIZE);
+}
+
+
+int main ()
+{
+ int i;
+ float a[10];
+ printf("Start\n");
+ for (i = 0; i < SIZE; i++)
+ s4 (a);
+ printf("Done\n");
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "Deleted dead calls" 1 "dse1"} } */
diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c
index 9220fea..6522a94 100644
--- a/gcc/tree-ssa-dse.c
+++ b/gcc/tree-ssa-dse.c
@@ -515,6 +515,28 @@ live_bytes_read (ao_ref use_ref, ao_ref *ref, sbitmap live)
return true;
}
+/* Return true if PHI stmt aliases only STMT1. */
+
+static bool
+phi_aliases_stmt_only (gphi *phi, gimple *stmt1)
+{
+ gimple *phi_use;
+ imm_use_iterator ui2;
+ tree def = PHI_RESULT (phi);
+ bool ok = true;
+
+ FOR_EACH_IMM_USE_STMT (phi_use, ui2, def)
+ {
+ if (phi_use != stmt1)
+ {
+ ok = false;
+ BREAK_FROM_IMM_USE_STMT (ui2);
+ }
+ }
+
+ return ok;
+}
+
/* A helper of dse_optimize_stmt.
Given a GIMPLE_ASSIGN in STMT that writes to REF, find a candidate
statement *USE_STMT that may prove STMT to be dead.
@@ -571,9 +593,14 @@ dse_classify_store (ao_ref *ref, gimple *stmt, gimple **use_stmt,
{
if (temp
/* Make sure we are not in a loop latch block. */
- || gimple_bb (stmt) == gimple_bb (use_stmt)
- || dominated_by_p (CDI_DOMINATORS,
- gimple_bb (stmt), gimple_bb (use_stmt))
+ || ((gimple_bb (stmt) == gimple_bb (use_stmt)
+ || dominated_by_p (CDI_DOMINATORS,
+ gimple_bb (stmt), gimple_bb (use_stmt)))
+ /* When reaching a loop PHI, the only aliasing stmt
+ in its use-chain is the stmt you reached the
+ PHI is OK. */
+ && !phi_aliases_stmt_only (as_a <gphi *> (use_stmt),
+ stmt))
/* We can look through PHIs to regions post-dominating
the DSE candidate stmt. */
|| !dominated_by_p (CDI_POST_DOMINATORS,
--
2.7.4