+2014-06-18 Richard Biener <rguenther@suse.de>
+
+ * tree-pass.h (make_pass_dce_loop): Remove.
+ * passes.def: Replace pass_dce_loop with pass_dce.
+ * tree-ssa-dce.c (perform_tree_ssa_dce): If something
+ changed free niter estimates and reset the scev cache.
+ (tree_ssa_dce_loop, pass_data_dce_loop, pass_dce_loop,
+ make_pass_dce_loop): Remove.
+ * tree-ssa-copy.c: Include tree-ssa-loop-niter.h.
+ (fini_copy_prop): Return whether something changed. Always
+ let substitute_and_fold perform DCE and free niter estimates
+ and reset the scev cache if so.
+ (execute_copy_prop): If sth changed schedule cleanup-cfg.
+ (pass_data_copy_prop): Do not unconditionally schedule
+ cleanup-cfg or update-ssa.
+
2014-06-18 Yuri Rumyantsev <ysrumyan@gmail.com>
PR tree-optimization/61518
NEXT_PASS (pass_tree_loop_init);
NEXT_PASS (pass_lim);
NEXT_PASS (pass_copy_prop);
- NEXT_PASS (pass_dce_loop);
+ NEXT_PASS (pass_dce);
NEXT_PASS (pass_tree_unswitch);
NEXT_PASS (pass_scev_cprop);
NEXT_PASS (pass_record_bounds);
NEXT_PASS (pass_graphite_transforms);
NEXT_PASS (pass_lim);
NEXT_PASS (pass_copy_prop);
- NEXT_PASS (pass_dce_loop);
+ NEXT_PASS (pass_dce);
POP_INSERT_PASSES ()
NEXT_PASS (pass_iv_canon);
NEXT_PASS (pass_parallelize_loops);
Please do not add any other passes in between. */
NEXT_PASS (pass_vectorize);
PUSH_INSERT_PASSES_WITHIN (pass_vectorize)
- NEXT_PASS (pass_dce_loop);
+ NEXT_PASS (pass_dce);
POP_INSERT_PASSES ()
NEXT_PASS (pass_predcom);
NEXT_PASS (pass_complete_unroll);
+2014-06-18 Richard Biener <rguenther@suse.de>
+
+ * tree-pass.h (make_pass_dce_loop): Remove.
+ * passes.def: Replace pass_dce_loop with pass_dce.
+ * tree-ssa-dce.c (perform_tree_ssa_dce): If something
+ changed free niter estimates and reset the scev cache.
+ (tree_ssa_dce_loop, pass_data_dce_loop, pass_dce_loop,
+ make_pass_dce_loop): Remove.
+ * tree-ssa-copy.c: Include tree-ssa-loop-niter.h.
+ (fini_copy_prop): Return whether something changed. Always
+ let substitute_and_fold perform DCE and free niter estimates
+ and reset the scev cache if so.
+ (execute_copy_prop): If sth changed schedule cleanup-cfg.
+ (pass_data_copy_prop): Do not unconditionally schedule
+ cleanup-cfg or update-ssa.
+
+ * gcc.dg/vect/vect.exp: Remove dump-tree-dceloop-* processing.
+ * gcc.dg/vect/dump-tree-dceloop-pr26359.c: Rename to ...
+ * gcc.dg/vect/pr26359.c: ... this and adjust appropriately.
+
2014-06-18 Yuri Rumyantsev <ysrumyan@gmail.com>
PR tree-optimization/61518
/* { dg-do compile } */
/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-fdump-tree-dce5-details" } */
int a[256], b[256], c[256];
}
}
-/* { dg-final { scan-tree-dump-times "Deleting : vect_" 0 "dceloop3" } } */
-/* { dg-final { cleanup-tree-dump "dceloop\[1-3\]" } } */
+/* { dg-final { scan-tree-dump-times "Deleting : vect_" 0 "dce5" } } */
+/* { dg-final { cleanup-tree-dump "dce" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/trapv-*.\[cS\]]] \
"" $DEFAULT_VECTCFLAGS
-# -fdump-tree-dceloop-details tests
-set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
-lappend DEFAULT_VECTCFLAGS "-fdump-tree-dceloop-details"
-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/dump-tree-dceloop-*.\[cS\]]] \
- "" $DEFAULT_VECTCFLAGS
-
# -fno-tree-dce tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-fno-tree-dce"
extern gimple_opt_pass *make_pass_build_ealias (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_dominator (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_dce (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_dce_loop (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_cd_dce (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_call_cdce (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_merge_phi (gcc::context *ctxt);
#include "cfgloop.h"
#include "tree-scalar-evolution.h"
#include "tree-ssa-dom.h"
+#include "tree-ssa-loop-niter.h"
+
/* This file implements the copy propagation pass and provides a
handful of interfaces for performing const/copy propagation and
/* Deallocate memory used in copy propagation and do final
substitution. */
-static void
+static bool
fini_copy_prop (void)
{
unsigned i;
}
}
- /* Don't do DCE if SCEV is initialized. It would destroy the scev cache. */
- substitute_and_fold (get_value, NULL, !scev_initialized_p ());
+ bool changed = substitute_and_fold (get_value, NULL, true);
+ if (changed)
+ {
+ free_numbers_of_iterations_estimates ();
+ if (scev_initialized_p ())
+ scev_reset ();
+ }
free (copy_of);
+
+ return changed;
}
{
init_copy_prop ();
ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
- fini_copy_prop ();
+ if (fini_copy_prop ())
+ return TODO_cleanup_cfg;
return 0;
}
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
- ( TODO_cleanup_cfg | TODO_update_ssa ), /* todo_flags_finish */
+ 0, /* todo_flags_finish */
};
class pass_copy_prop : public gimple_opt_pass
tree_dce_done (aggressive);
if (something_changed)
- return TODO_update_ssa | TODO_cleanup_cfg;
+ {
+ free_numbers_of_iterations_estimates ();
+ if (scev_initialized_p)
+ scev_reset ();
+ return TODO_update_ssa | TODO_cleanup_cfg;
+ }
return 0;
}
return perform_tree_ssa_dce (/*aggressive=*/false);
}
-static unsigned int
-tree_ssa_dce_loop (void)
-{
- unsigned int todo;
- todo = perform_tree_ssa_dce (/*aggressive=*/false);
- if (todo)
- {
- free_numbers_of_iterations_estimates ();
- scev_reset ();
- }
- return todo;
-}
-
static unsigned int
tree_ssa_cd_dce (void)
{
namespace {
-const pass_data pass_data_dce_loop =
-{
- GIMPLE_PASS, /* type */
- "dceloop", /* name */
- OPTGROUP_NONE, /* optinfo_flags */
- true, /* has_execute */
- TV_TREE_DCE, /* tv_id */
- ( PROP_cfg | PROP_ssa ), /* properties_required */
- 0, /* properties_provided */
- 0, /* properties_destroyed */
- 0, /* todo_flags_start */
- 0, /* todo_flags_finish */
-};
-
-class pass_dce_loop : public gimple_opt_pass
-{
-public:
- pass_dce_loop (gcc::context *ctxt)
- : gimple_opt_pass (pass_data_dce_loop, ctxt)
- {}
-
- /* opt_pass methods: */
- opt_pass * clone () { return new pass_dce_loop (m_ctxt); }
- virtual bool gate (function *) { return flag_tree_dce != 0; }
- virtual unsigned int execute (function *) { return tree_ssa_dce_loop (); }
-
-}; // class pass_dce_loop
-
-} // anon namespace
-
-gimple_opt_pass *
-make_pass_dce_loop (gcc::context *ctxt)
-{
- return new pass_dce_loop (ctxt);
-}
-
-namespace {
-
const pass_data pass_data_cd_dce =
{
GIMPLE_PASS, /* type */