Hi,
now that I've moved insertion of the IFN_GOACC_DIM_POS call to parloops
( https://gcc.gnu.org/ml/gcc-patches/2015-11/msg00847.html ) , there's
no need anymore for the dead_load_p hack in parloops.
This patch adds a pass_dce invocation in the kernels pass group.
Committed to gomp-4_0-branch.
Thanks,
- Tom
Add pass_dce in oacc kernels pass group
2015-11-08 Tom de Vries <t...@codesourcery.com>
* passes.def: Add pass_dce in oacc kernels pass group.
* tree-parloops.c (dead_load_p): Remove.
(ref_conflicts_with_region, oacc_entry_exit_ok_1): Remove handling of
dead loads.
* g++.dg/tree-ssa/copyprop-1.C: Update for extra pass_dce in pass list.
* gcc.dg/pr23911.c: Same.
* gcc.dg/tree-ssa/20030709-2.c: Same.
* gcc.dg/tree-ssa/20030731-2.c: Same.
* gcc.dg/tree-ssa/20040729-1.c: Same.
* gcc.dg/tree-ssa/cfgcleanup-1.c: Same.
* gcc.dg/tree-ssa/loop-36.c: Same.
* gcc.dg/tree-ssa/pr21086.c: Same.
* gcc.dg/tree-ssa/ssa-dce-1.c: Same.
* gcc.dg/tree-ssa/ssa-dce-2.c: Same.
* gcc.dg/vect/pr26359.c: Same.
---
gcc/passes.def | 1 +
gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C | 4 +--
gcc/testsuite/gcc.dg/pr23911.c | 6 ++---
gcc/testsuite/gcc.dg/tree-ssa/20030709-2.c | 8 +++---
gcc/testsuite/gcc.dg/tree-ssa/20030731-2.c | 4 +--
gcc/testsuite/gcc.dg/tree-ssa/20040729-1.c | 4 +--
gcc/testsuite/gcc.dg/tree-ssa/cfgcleanup-1.c | 4 +--
gcc/testsuite/gcc.dg/tree-ssa/loop-36.c | 4 +--
gcc/testsuite/gcc.dg/tree-ssa/pr21086.c | 6 ++---
gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-1.c | 4 +--
gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-2.c | 4 +--
gcc/testsuite/gcc.dg/vect/pr26359.c | 4 +--
gcc/tree-parloops.c | 39 ----------------------------
13 files changed, 27 insertions(+), 65 deletions(-)
diff --git a/gcc/passes.def b/gcc/passes.def
index 5683bb7..2420b3b 100644
--- a/gcc/passes.def
+++ b/gcc/passes.def
@@ -101,6 +101,7 @@ along with GCC; see the file COPYING3. If not see
NEXT_PASS (pass_scev_cprop);
NEXT_PASS (pass_tree_loop_done);
NEXT_PASS (pass_dominator_oacc_kernels);
+ NEXT_PASS (pass_dce);
NEXT_PASS (pass_tree_loop_init);
NEXT_PASS (pass_parallelize_loops_oacc_kernels);
NEXT_PASS (pass_expand_omp_ssa);
diff --git a/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C b/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C
index 5ff289c..34a9f7b 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O -fdump-tree-dce2" } */
+/* { dg-options "-O -fdump-tree-dce3" } */
/* Verify that we can eliminate the useless conversions to/from
const qualified pointer types
@@ -27,4 +27,4 @@ int foo(Object&o)
/* Remaining should be two loads. */
-/* { dg-final { scan-tree-dump-times " = \[^\n\]*;" 2 "dce2" } } */
+/* { dg-final { scan-tree-dump-times " = \[^\n\]*;" 2 "dce3" } } */
diff --git a/gcc/testsuite/gcc.dg/pr23911.c b/gcc/testsuite/gcc.dg/pr23911.c
index 2c27397..3fa0412 100644
--- a/gcc/testsuite/gcc.dg/pr23911.c
+++ b/gcc/testsuite/gcc.dg/pr23911.c
@@ -1,7 +1,7 @@
/* This was a missed optimization in tree constant propagation
that CSE would catch later on. */
/* { dg-do compile } */
-/* { dg-options "-O -fdump-tree-dce2" } */
+/* { dg-options "-O -fdump-tree-dce3" } */
double _Complex *a;
static const double _Complex b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
@@ -16,5 +16,5 @@ test (void)
/* After DCE2 which runs after FRE, the expressions should be fully
constant folded. There should be no loads from b left. */
-/* { dg-final { scan-tree-dump-times "__complex__ \\\(1.0e\\\+0, 0.0\\\)" 2 "dce2" } } */
-/* { dg-final { scan-tree-dump-times "= b" 0 "dce2" } } */
+/* { dg-final { scan-tree-dump-times "__complex__ \\\(1.0e\\\+0, 0.0\\\)" 2 "dce3" } } */
+/* { dg-final { scan-tree-dump-times "= b" 0 "dce3" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030709-2.c b/gcc/testsuite/gcc.dg/tree-ssa/20030709-2.c
index d4f42f9..5009cd6 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20030709-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20030709-2.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O -fdump-tree-dce2" } */
+/* { dg-options "-O -fdump-tree-dce3" } */
struct rtx_def;
typedef struct rtx_def *rtx;
@@ -42,13 +42,13 @@ get_alias_set (t)
/* There should be precisely one load of ->decl.rtl. If there is
more than, then the dominator optimizations failed. */
-/* { dg-final { scan-tree-dump-times "->decl\\.rtl" 1 "dce2"} } */
+/* { dg-final { scan-tree-dump-times "->decl\\.rtl" 1 "dce3"} } */
/* There should be no loads of .rtmem since the complex return statement
is just "return 0". */
-/* { dg-final { scan-tree-dump-times ".rtmem" 0 "dce2"} } */
+/* { dg-final { scan-tree-dump-times ".rtmem" 0 "dce3"} } */
/* There should be one IF statement (the complex return statement should
collapse down to a simple return 0 without any conditionals). */
-/* { dg-final { scan-tree-dump-times "if " 1 "dce2"} } */
+/* { dg-final { scan-tree-dump-times "if " 1 "dce3"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030731-2.c b/gcc/testsuite/gcc.dg/tree-ssa/20030731-2.c
index bdb22ff..069f953 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20030731-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20030731-2.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dce1" } */
+/* { dg-options "-O2 -fdump-tree-dce2" } */
void foo (void);
@@ -15,4 +15,4 @@ bar (int i, int partial, int args_addr)
/* There should be only one IF conditional since the first does nothing
useful. */
-/* { dg-final { scan-tree-dump-times "if " 1 "dce1"} } */
+/* { dg-final { scan-tree-dump-times "if " 1 "dce2"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20040729-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20040729-1.c
index 6e7ffbb..812887a 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20040729-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20040729-1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O1 -fdump-tree-dce2" } */
+/* { dg-options "-O1 -fdump-tree-dce3" } */
int
foo ()
@@ -16,4 +16,4 @@ foo ()
compiler was mistakenly thinking that the statement had volatile
operands. But 'p' itself is not volatile and taking the address of
a volatile does not constitute a volatile operand. */
-/* { dg-final { scan-tree-dump-times "&x" 0 "dce2"} } */
+/* { dg-final { scan-tree-dump-times "&x" 0 "dce3"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cfgcleanup-1.c b/gcc/testsuite/gcc.dg/tree-ssa/cfgcleanup-1.c
index 4d22a42..53ce973 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/cfgcleanup-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cfgcleanup-1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dce1" } */
+/* { dg-options "-O2 -fdump-tree-dce2" } */
void
cleanup (int a, int b)
{
@@ -15,4 +15,4 @@ cleanup (int a, int b)
return;
}
/* Dce should get rid of the initializers and cfgcleanup should elliminate ifs */
-/* { dg-final { scan-tree-dump-times "if " 0 "dce1"} } */
+/* { dg-final { scan-tree-dump-times "if " 0 "dce2"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loop-36.c b/gcc/testsuite/gcc.dg/tree-ssa/loop-36.c
index d922991..516cad9 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/loop-36.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/loop-36.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dce2" } */
+/* { dg-options "-O2 -fdump-tree-dce3" } */
struct X { float array[2]; };
@@ -18,4 +18,4 @@ float foobar () {
/* The temporary structure should have been promoted to registers
by FRE after the loops have been unrolled by the early unrolling pass. */
-/* { dg-final { scan-tree-dump-not "c\.array" "dce2" } } */
+/* { dg-final { scan-tree-dump-not "c\.array" "dce3" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c
index 26ea817..e8b62c2 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-dce1 -fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-dce2 -fdelete-null-pointer-checks" } */
int
foo (int *p)
@@ -18,5 +18,5 @@ foo (int *p)
/* Target disabling -fdelete-null-pointer-checks should not fold checks */
/* { dg-final { scan-tree-dump "Folding predicate " "vrp1" { target { ! keeps_null_pointer_checks } } } } */
/* { dg-final { scan-tree-dump-times "Folding predicate " 0 "vrp1" { target { keeps_null_pointer_checks } } } } */
-/* { dg-final { scan-tree-dump-not "b_. =" "dce1" { target { ! avr-*-* } } } } */
-/* { dg-final { scan-tree-dump "b_. =" "dce1" { target { avr-*-* } } } } */
+/* { dg-final { scan-tree-dump-not "b_. =" "dce2" { target { ! avr-*-* } } } } */
+/* { dg-final { scan-tree-dump "b_. =" "dce2" { target { avr-*-* } } } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-1.c
index 4a8c6b6..0c478d1 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O1 -fdump-tree-dce2" } */
+/* { dg-options "-O1 -fdump-tree-dce3" } */
int t() __attribute__ ((const));
void
@@ -10,4 +10,4 @@ q()
i = t();
}
/* There should be no IF conditionals. */
-/* { dg-final { scan-tree-dump-times "if " 0 "dce2"} } */
+/* { dg-final { scan-tree-dump-times "if " 0 "dce3"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-2.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-2.c
index 6281a1e..b3f5073 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-2.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dce2" } */
+/* { dg-options "-O2 -fdump-tree-dce3" } */
/* We should notice constantness of this function. */
static int __attribute__((noinline)) t(int a)
@@ -13,4 +13,4 @@ void q(void)
i = t(1);
}
/* There should be no IF conditionals. */
-/* { dg-final { scan-tree-dump-times "if " 0 "dce2"} } */
+/* { dg-final { scan-tree-dump-times "if " 0 "dce3"} } */
diff --git a/gcc/testsuite/gcc.dg/vect/pr26359.c b/gcc/testsuite/gcc.dg/vect/pr26359.c
index 597ee7e..5b445a9 100644
--- a/gcc/testsuite/gcc.dg/vect/pr26359.c
+++ b/gcc/testsuite/gcc.dg/vect/pr26359.c
@@ -1,6 +1,6 @@
/* { dg-do compile } */
/* { dg-require-effective-target vect_int } */
-/* { dg-additional-options "-fdump-tree-dce5-details" } */
+/* { dg-additional-options "-fdump-tree-dce6-details" } */
int a[256], b[256], c[256];
@@ -13,4 +13,4 @@ foo () {
}
}
-/* { dg-final { scan-tree-dump-times "Deleting : vect_" 0 "dce5" } } */
+/* { dg-final { scan-tree-dump-times "Deleting : vect_" 0 "dce6" } } */
diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
index 313637b..cb2be01 100644
--- a/gcc/tree-parloops.c
+++ b/gcc/tree-parloops.c
@@ -2767,22 +2767,6 @@ try_create_reduction_list (loop_p loop,
return true;
}
-/* Return true if STMT is a load of which the result is unused, and can be
- safely deleted. */
-
-static bool
-dead_load_p (gimple *stmt)
-{
- if (!gimple_assign_load_p (stmt))
- return false;
-
- tree lhs = gimple_assign_lhs (stmt);
- return (TREE_CODE (lhs) == SSA_NAME
- && has_zero_uses (lhs)
- && !gimple_has_side_effects (stmt)
- && !stmt_could_throw_p (stmt));
-}
-
static bool
ref_conflicts_with_region (gimple_stmt_iterator gsi, ao_ref *ref,
bool ref_is_store, vec<basic_block> region_bbs,
@@ -2816,16 +2800,6 @@ ref_conflicts_with_region (gimple_stmt_iterator gsi, ao_ref *ref,
if (ref_is_store)
{
- if (dead_load_p (stmt))
- {
- if (dump_file)
- {
- fprintf (dump_file, "skipping dead load: ");
- print_gimple_stmt (dump_file, stmt, 0, 0);
- }
- continue;
- }
-
if (ref_maybe_used_by_stmt_p (stmt, ref))
{
if (dump_file)
@@ -2893,19 +2867,6 @@ oacc_entry_exit_ok_1 (bitmap in_loop_bbs, vec<basic_block> region_bbs,
&& operand_equal_p (TREE_OPERAND (base, 0), omp_data_i, 0))
continue;
- /* By testing for dead loads (here and in
- ref_conflicts_with_region), we avoid having to run pass_dce
- before pass_parallelize_loops_oacc_kernels. */
- if (dead_load_p (stmt))
- {
- if (dump_file)
- {
- fprintf (dump_file, "skipping dead load: ");
- print_gimple_stmt (dump_file, stmt, 0, 0);
- }
- continue;
- }
-
tree lhs = gimple_assign_lhs (stmt);
if (TREE_CODE (lhs) == SSA_NAME
&& has_single_use (lhs))
--
1.9.1