This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Simplify SCEV entry
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 10 Oct 2017 12:34:34 +0200 (CEST)
- Subject: [PATCH] Simplify SCEV entry
- Authentication-results: sourceware.org; auth=none
This simplifies SCEV analyze_scalar_evolution_1 by removing what appeared
to be dead code for the case of res != chrec_not_analyzed_yet. Adding
a gcc_unrechable () turned up a rather serious bug though as in the
loop pipeline we get a messed up SCEV cache if CFG cleanup renumbers
blocks given SCEV uses BB indices in the cache. Fixing that makes
bootstrapping with gcc_unreachable in the place of the removed code
below work:
Index: gcc/tree-scalar-evolution.c
===================================================================
--- gcc/tree-scalar-evolution.c (revision 253545)
+++ gcc/tree-scalar-evolution.c (working copy)
@@ -2072,8 +2072,11 @@ analyze_scalar_evolution_1 (struct loop
if (res != chrec_not_analyzed_yet)
{
if (loop != bb->loop_father)
+ {
+ gcc_unreachable ();
res = compute_scalar_evolution_in_loop
(find_common_loop (loop, bb->loop_father), bb->loop_father,
res);
+ }
goto set_and_end;
}
thus the following (which is really a bugfix plus code simplification).
Bootstrap and regtest running on x86_64-unknown-linux-gnu.
I should probably backport that CFG cleanup hunk...
Richard.
2017-10-10 Richard Biener <rguenther@suse.de>
* tree-cfgcleanup.c (cleanup_tree_cfg_noloop): Avoid compacting
blocks if SCEV is active.
* tree-scalar-evolution.c (analyze_scalar_evolution_1): Remove
dead code.
(analyze_scalar_evolution): Handle cached evolutions the obvious way.
(scev_initialize): Assert we are not yet initialized.
Index: gcc/tree-cfgcleanup.c
===================================================================
--- gcc/tree-cfgcleanup.c (revision 253580)
+++ gcc/tree-cfgcleanup.c (working copy)
@@ -892,7 +892,11 @@ cleanup_tree_cfg_noloop (void)
changed |= cleanup_tree_cfg_1 ();
gcc_assert (dom_info_available_p (CDI_DOMINATORS));
- compact_blocks ();
+
+ /* Do not renumber blocks if the SCEV cache is active, it is indexed by
+ basic-block numbers. */
+ if (! scev_initialized_p ())
+ compact_blocks ();
checking_verify_flow_info ();
Index: gcc/tree-scalar-evolution.c
===================================================================
--- gcc/tree-scalar-evolution.c (revision 253580)
+++ gcc/tree-scalar-evolution.c (working copy)
@@ -281,7 +281,7 @@ along with GCC; see the file COPYING3.
#include "tree-ssa-propagate.h"
#include "gimple-fold.h"
-static tree analyze_scalar_evolution_1 (struct loop *, tree, tree);
+static tree analyze_scalar_evolution_1 (struct loop *, tree);
static tree analyze_scalar_evolution_for_address_of (struct loop *loop,
tree var);
@@ -2036,18 +2036,19 @@ compute_scalar_evolution_in_loop (struct
if (no_evolution_in_loop_p (res, wrto_loop->num, &val) && val)
return res;
- return analyze_scalar_evolution_1 (wrto_loop, res, chrec_not_analyzed_yet);
+ return analyze_scalar_evolution_1 (wrto_loop, res);
}
/* Helper recursive function. */
static tree
-analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res)
+analyze_scalar_evolution_1 (struct loop *loop, tree var)
{
tree type = TREE_TYPE (var);
gimple *def;
basic_block bb;
struct loop *def_loop;
+ tree res;
if (loop == NULL
|| TREE_CODE (type) == VECTOR_TYPE
@@ -2069,18 +2070,9 @@ analyze_scalar_evolution_1 (struct loop
goto set_and_end;
}
- if (res != chrec_not_analyzed_yet)
- {
- if (loop != bb->loop_father)
- res = compute_scalar_evolution_in_loop
- (find_common_loop (loop, bb->loop_father), bb->loop_father, res);
-
- goto set_and_end;
- }
-
if (loop != def_loop)
{
- res = analyze_scalar_evolution_1 (def_loop, var, chrec_not_analyzed_yet);
+ res = analyze_scalar_evolution_1 (def_loop, var);
res = compute_scalar_evolution_in_loop (loop, def_loop, res);
goto set_and_end;
@@ -2144,7 +2136,8 @@ analyze_scalar_evolution (struct loop *l
}
res = get_scalar_evolution (block_before_loop (loop), var);
- res = analyze_scalar_evolution_1 (loop, var, res);
+ if (res == chrec_not_analyzed_yet)
+ res = analyze_scalar_evolution_1 (loop, var);
if (dump_file && (dump_flags & TDF_SCEV))
fprintf (dump_file, ")\n");
@@ -3264,6 +3257,8 @@ scev_initialize (void)
{
struct loop *loop;
+ gcc_assert (! scev_initialized_p ());
+
scalar_evolution_info = hash_table<scev_info_hasher>::create_ggc (100);
initialize_scalar_evolutions_analyzer ();