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 <kug...@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 <kug...@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.vivekanandara...@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