further optimize non-store-motion LIM

This removes useless work from LIM when store-motion is disabled.

2020-11-16   Richard Biener  <rguenther@suse.de>

	* tree-ssa-loop-im.c (analyze_memory_references): Add
	store_motion parameter and elide unnecessary work.
	(tree_ssa_lim_initialize): Likewise.
	(loop_invariant_motion_in_fun): Pass down store_motion.
This commit is contained in:
Richard Biener 2020-11-16 14:25:56 +01:00
parent 2f473f4b06
commit d1746388db

View file

@ -1622,7 +1622,7 @@ sort_locs_in_loop_postorder_cmp (const void *loc1_, const void *loc2_,
/* Gathers memory references in loops. */
static void
analyze_memory_references (void)
analyze_memory_references (bool store_motion)
{
gimple_stmt_iterator bsi;
basic_block bb, *bbs;
@ -1665,6 +1665,9 @@ analyze_memory_references (void)
free (bbs);
if (!store_motion)
return;
/* Propagate the information about accessed memory references up
the loop hierarchy. */
FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
@ -3010,7 +3013,7 @@ fill_always_executed_in (void)
/* Compute the global information needed by the loop invariant motion pass. */
static void
tree_ssa_lim_initialize (void)
tree_ssa_lim_initialize (bool store_motion)
{
class loop *loop;
unsigned i;
@ -3032,8 +3035,12 @@ tree_ssa_lim_initialize (void)
memory_accesses.refs_loaded_in_loop.quick_grow (number_of_loops (cfun));
memory_accesses.refs_stored_in_loop.create (number_of_loops (cfun));
memory_accesses.refs_stored_in_loop.quick_grow (number_of_loops (cfun));
memory_accesses.all_refs_stored_in_loop.create (number_of_loops (cfun));
memory_accesses.all_refs_stored_in_loop.quick_grow (number_of_loops (cfun));
if (store_motion)
{
memory_accesses.all_refs_stored_in_loop.create (number_of_loops (cfun));
memory_accesses.all_refs_stored_in_loop.quick_grow
(number_of_loops (cfun));
}
for (i = 0; i < number_of_loops (cfun); i++)
{
@ -3041,8 +3048,9 @@ tree_ssa_lim_initialize (void)
&lim_bitmap_obstack);
bitmap_initialize (&memory_accesses.refs_stored_in_loop[i],
&lim_bitmap_obstack);
bitmap_initialize (&memory_accesses.all_refs_stored_in_loop[i],
&lim_bitmap_obstack);
if (store_motion)
bitmap_initialize (&memory_accesses.all_refs_stored_in_loop[i],
&lim_bitmap_obstack);
}
memory_accesses.ttae_cache = NULL;
@ -3097,10 +3105,10 @@ loop_invariant_motion_in_fun (function *fun, bool store_motion)
{
unsigned int todo = 0;
tree_ssa_lim_initialize ();
tree_ssa_lim_initialize (store_motion);
/* Gathers information about memory accesses in the loops. */
analyze_memory_references ();
analyze_memory_references (store_motion);
/* Fills ALWAYS_EXECUTED_IN information for basic blocks. */
fill_always_executed_in ();