Commit 6b416da1 by Daniel Berlin Committed by Daniel Berlin

tree-ssa-pre.c (bb_value_sets): phi_gen, tmp_gen, new_sets now are bitmap_set_t's.

2004-07-04  Daniel Berlin  <dberlin@dberlin.org>

	* tree-ssa-pre.c (bb_value_sets): phi_gen, tmp_gen, new_sets
	now are bitmap_set_t's.
	(bitmap_insert_into_set): No point in inserting the value if
	it's invariant.
	(bitmap_set_contains): New function.
	(bitmap_set_replace_value): Add comment on why we do it
	this way.
	(set_contains): Removed.
	(bitmap_set_subtract_from_value_set): New name of
	set_subtract now that it's arguments are two different
	types of sets.
	Update callers.
	(bitmap_find_leader): Change algorithm used.
	(find_or_generate_expression): Update use of functions for new
	bitmap sets.
	(create_expression_by_pieces): Ditto.
	(insert_aux): Ditto.
	(insert): Ditto.
	(add_to_sets): Ditto.
	(init_pre): Ditto.
	(execute_pre): Ditto.
	(compute_avail): Ditto.
	Also ignore virtual phis.

From-SVN: r84099
parent b8ff6ca0
2004-07-04 Daniel Berlin <dberlin@dberlin.org>
* tree-ssa-pre.c (bb_value_sets): phi_gen, tmp_gen, new_sets
now are bitmap_set_t's.
(bitmap_insert_into_set): No point in inserting the value if
it's invariant.
(bitmap_set_contains): New function.
(bitmap_set_replace_value): Add comment on why we do it
this way.
(set_contains): Removed.
(bitmap_set_subtract_from_value_set): New name of
set_subtract now that it's arguments are two different
types of sets.
Update callers.
(bitmap_find_leader): Change algorithm used.
(find_or_generate_expression): Update use of functions for new
bitmap sets.
(create_expression_by_pieces): Ditto.
(insert_aux): Ditto.
(insert): Ditto.
(add_to_sets): Ditto.
(init_pre): Ditto.
(execute_pre): Ditto.
(compute_avail): Ditto.
Also ignore virtual phis.
2004-07-04 Richard Sandiford <rsandifo@redhat.com> 2004-07-04 Richard Sandiford <rsandifo@redhat.com>
* combine.c (simplify_comparison): Fix comment typo. * combine.c (simplify_comparison): Fix comment typo.
......
...@@ -232,10 +232,7 @@ typedef struct bitmap_set ...@@ -232,10 +232,7 @@ typedef struct bitmap_set
bitmap values; bitmap values;
} *bitmap_set_t; } *bitmap_set_t;
/* All of the following sets, except for TMP_GEN, are indexed. /* Sets that we need to keep track of. */
TMP_GEN is only ever iterated over, we never check what values
exist in it. */
typedef struct bb_value_sets typedef struct bb_value_sets
{ {
/* The EXP_GEN set, which represents expressions/values generated in /* The EXP_GEN set, which represents expressions/values generated in
...@@ -244,11 +241,11 @@ typedef struct bb_value_sets ...@@ -244,11 +241,11 @@ typedef struct bb_value_sets
/* The PHI_GEN set, which represents PHI results generated in a /* The PHI_GEN set, which represents PHI results generated in a
basic block. */ basic block. */
value_set_t phi_gen; bitmap_set_t phi_gen;
/* The TMP_GEN set, which represents results/temporaries generated /* The TMP_GEN set, which represents results/temporaries generated
in a basic block. IE the LHS of an expression. */ in a basic block. IE the LHS of an expression. */
value_set_t tmp_gen; bitmap_set_t tmp_gen;
/* The AVAIL_OUT set, which represents which values are available in /* The AVAIL_OUT set, which represents which values are available in
a given basic block. */ a given basic block. */
...@@ -261,7 +258,7 @@ typedef struct bb_value_sets ...@@ -261,7 +258,7 @@ typedef struct bb_value_sets
/* The NEW_SETS set, which is used during insertion to augment the /* The NEW_SETS set, which is used during insertion to augment the
AVAIL_OUT set of blocks with the new insertions performed during AVAIL_OUT set of blocks with the new insertions performed during
the current iteration. */ the current iteration. */
value_set_t new_sets; bitmap_set_t new_sets;
} *bb_value_sets_t; } *bb_value_sets_t;
#define EXP_GEN(BB) ((bb_value_sets_t) ((BB)->aux))->exp_gen #define EXP_GEN(BB) ((bb_value_sets_t) ((BB)->aux))->exp_gen
...@@ -501,7 +498,7 @@ set_new (bool indexed) ...@@ -501,7 +498,7 @@ set_new (bool indexed)
return ret; return ret;
} }
/* Insert an expression, EXPR, into a bitmapped set. */ /* Insert an expression EXPR into a bitmapped set. */
static void static void
bitmap_insert_into_set (bitmap_set_t set, tree expr) bitmap_insert_into_set (bitmap_set_t set, tree expr)
...@@ -514,8 +511,8 @@ bitmap_insert_into_set (bitmap_set_t set, tree expr) ...@@ -514,8 +511,8 @@ bitmap_insert_into_set (bitmap_set_t set, tree expr)
if (val == NULL) if (val == NULL)
abort (); abort ();
if (!is_gimple_min_invariant (val))
bitmap_set_bit (set->values, VALUE_HANDLE_ID (val)); bitmap_set_bit (set->values, VALUE_HANDLE_ID (val));
bitmap_set_bit (set->expressions, SSA_NAME_VERSION (expr)); bitmap_set_bit (set->expressions, SSA_NAME_VERSION (expr));
} }
...@@ -623,6 +620,17 @@ set_contains_value (value_set_t set, tree val) ...@@ -623,6 +620,17 @@ set_contains_value (value_set_t set, tree val)
return value_exists_in_set_bitmap (set, val); return value_exists_in_set_bitmap (set, val);
} }
/* Return true if bitmapped set SET contains the expression EXPR. */
static bool
bitmap_set_contains (bitmap_set_t set, tree expr)
{
/* XXX: Bitmapped sets only contain SSA_NAME's for now. */
if (TREE_CODE (expr) != SSA_NAME)
return false;
return bitmap_bit_p (set->expressions, SSA_NAME_VERSION (expr));
}
/* Return true if bitmapped set SET contains the value VAL. */ /* Return true if bitmapped set SET contains the value VAL. */
static bool static bool
...@@ -644,6 +652,15 @@ bitmap_set_replace_value (bitmap_set_t set, tree lookfor, tree expr) ...@@ -644,6 +652,15 @@ bitmap_set_replace_value (bitmap_set_t set, tree lookfor, tree expr)
return; return;
if (!bitmap_set_contains_value (set, lookfor)) if (!bitmap_set_contains_value (set, lookfor))
return; return;
/* The number of expressions having a given value is usually
significantly less than the total number of expressions in SET.
Thus, rather than check, for each expression in SET, whether it
has the value LOOKFOR, we walk the reverse mapping that tells us
what expressions have a given value, and see if any of those
expressions are in our set. For large testcases, this is about
5-10x faster than walking the bitmap. If this is somehow a
significant lose for some cases, we can choose which set to walk
based on the set size. */
exprset = VALUE_HANDLE_EXPR_SET (lookfor); exprset = VALUE_HANDLE_EXPR_SET (lookfor);
for (node = exprset->head; node; node = node->next) for (node = exprset->head; node; node = node->next)
{ {
...@@ -659,27 +676,11 @@ bitmap_set_replace_value (bitmap_set_t set, tree lookfor, tree expr) ...@@ -659,27 +676,11 @@ bitmap_set_replace_value (bitmap_set_t set, tree lookfor, tree expr)
} }
} }
/* Return true if the set contains expression (not value) EXPR. */ /* Subtract bitmapped set B from value set A, and return the new set. */
static bool
set_contains (value_set_t set, tree expr)
{
value_set_node_t node;
for (node = set->head;
node;
node = node->next)
{
if (operand_equal_p (node->expr, expr, 0))
return true;
}
return false;
}
/* Subtract set B from set A, and return the new set. */
static value_set_t static value_set_t
set_subtract (value_set_t a, value_set_t b, bool indexed) bitmap_set_subtract_from_value_set (value_set_t a, bitmap_set_t b,
bool indexed)
{ {
value_set_t ret = set_new (indexed); value_set_t ret = set_new (indexed);
value_set_node_t node; value_set_node_t node;
...@@ -687,7 +688,7 @@ set_subtract (value_set_t a, value_set_t b, bool indexed) ...@@ -687,7 +688,7 @@ set_subtract (value_set_t a, value_set_t b, bool indexed)
node; node;
node = node->next) node = node->next)
{ {
if (!set_contains (b, node->expr)) if (!bitmap_set_contains (b, node->expr))
insert_into_set (ret, node->expr); insert_into_set (ret, node->expr);
} }
return ret; return ret;
...@@ -970,13 +971,29 @@ bitmap_find_leader (bitmap_set_t set, tree val) ...@@ -970,13 +971,29 @@ bitmap_find_leader (bitmap_set_t set, tree val)
return val; return val;
if (bitmap_set_contains_value (set, val)) if (bitmap_set_contains_value (set, val))
{ {
int i; /* Rather than walk the entire bitmap of expressions, and see
EXECUTE_IF_SET_IN_BITMAP (set->expressions, 0, i, whether any of them has the value we are looking for, we look
{ at the reverse mapping, which tells us the set of expressions
if (get_value_handle (ssa_name (i)) == val) that have a given value (IE value->expressions with that
return ssa_name (i); value) and see if any of those expressions are in our set.
}); The number of expressions per value is usually significantly
less than the number of expressions in the set. In fact, for
large testcases, doing it this way is roughly 5-10x faster
than walking the bitmap.
If this is somehow a significant lose for some cases, we can
choose which set to walk based on which set is smaller. */
value_set_t exprset;
value_set_node_t node;
exprset = VALUE_HANDLE_EXPR_SET (val);
for (node = exprset->head; node; node = node->next)
{
if (TREE_CODE (node->expr) == SSA_NAME)
{
if (bitmap_bit_p (set->expressions,
SSA_NAME_VERSION (node->expr)))
return node->expr;
}
}
} }
return NULL; return NULL;
} }
...@@ -1178,10 +1195,12 @@ compute_antic_aux (basic_block block) ...@@ -1178,10 +1195,12 @@ compute_antic_aux (basic_block block)
} }
/* Generate ANTIC_OUT - TMP_GEN */ /* Generate ANTIC_OUT - TMP_GEN */
S = set_subtract (ANTIC_OUT, TMP_GEN (block), false); S = bitmap_set_subtract_from_value_set (ANTIC_OUT, TMP_GEN (block), false);
/* Start ANTIC_IN with EXP_GEN - TMP_GEN */ /* Start ANTIC_IN with EXP_GEN - TMP_GEN */
ANTIC_IN (block) = set_subtract (EXP_GEN (block),TMP_GEN (block), true); ANTIC_IN (block) = bitmap_set_subtract_from_value_set (EXP_GEN (block),
TMP_GEN (block),
true);
/* Then union in the ANTIC_OUT - TMP_GEN values, to get ANTIC_OUT U /* Then union in the ANTIC_OUT - TMP_GEN values, to get ANTIC_OUT U
EXP_GEN - TMP_GEN */ EXP_GEN - TMP_GEN */
...@@ -1267,7 +1286,7 @@ find_or_generate_expression (basic_block block, tree expr, tree stmts) ...@@ -1267,7 +1286,7 @@ find_or_generate_expression (basic_block block, tree expr, tree stmts)
the NEW_SETS for us already, having been propagated from our the NEW_SETS for us already, having been propagated from our
dominator. */ dominator. */
if (genop == NULL) if (genop == NULL)
genop = find_leader (NEW_SETS (block), expr); genop = bitmap_find_leader (NEW_SETS (block), expr);
/* If it's still NULL, see if it is a complex expression, and if /* If it's still NULL, see if it is a complex expression, and if
so, generate it recursively, otherwise, abort, because it's so, generate it recursively, otherwise, abort, because it's
not really . */ not really . */
...@@ -1355,7 +1374,7 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts) ...@@ -1355,7 +1374,7 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
} }
v = get_value_handle (expr); v = get_value_handle (expr);
vn_add (name, v, NULL); vn_add (name, v, NULL);
insert_into_set (NEW_SETS (block), name); bitmap_insert_into_set (NEW_SETS (block), name);
bitmap_value_insert_into_set (AVAIL_OUT (block), name); bitmap_value_insert_into_set (AVAIL_OUT (block), name);
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
...@@ -1388,18 +1407,17 @@ insert_aux (basic_block block) ...@@ -1388,18 +1407,17 @@ insert_aux (basic_block block)
if (block) if (block)
{ {
value_set_node_t e;
basic_block dom; basic_block dom;
dom = get_immediate_dominator (CDI_DOMINATORS, block); dom = get_immediate_dominator (CDI_DOMINATORS, block);
if (dom) if (dom)
{ {
e = NEW_SETS (dom)->head; int i;
while (e) bitmap_set_t newset = NEW_SETS (dom);
{ EXECUTE_IF_SET_IN_BITMAP (newset->expressions, 0, i,
insert_into_set (NEW_SETS (block), e->expr); {
bitmap_value_replace_in_set (AVAIL_OUT (block), e->expr); bitmap_insert_into_set (NEW_SETS (block), ssa_name (i));
e = e->next; bitmap_value_replace_in_set (AVAIL_OUT (block), ssa_name (i));
} });
if (block->pred->pred_next) if (block->pred->pred_next)
{ {
value_set_node_t node; value_set_node_t node;
...@@ -1421,7 +1439,7 @@ insert_aux (basic_block block) ...@@ -1421,7 +1439,7 @@ insert_aux (basic_block block)
tree eprime; tree eprime;
val = get_value_handle (node->expr); val = get_value_handle (node->expr);
if (set_contains_value (PHI_GEN (block), val)) if (bitmap_set_contains_value (PHI_GEN (block), val))
continue; continue;
if (bitmap_set_contains_value (AVAIL_OUT (dom), val)) if (bitmap_set_contains_value (AVAIL_OUT (dom), val))
{ {
...@@ -1544,10 +1562,10 @@ insert_aux (basic_block block) ...@@ -1544,10 +1562,10 @@ insert_aux (basic_block block)
} }
pre_stats.phis++; pre_stats.phis++;
new_stuff = true; new_stuff = true;
insert_into_set (NEW_SETS (block), bitmap_insert_into_set (NEW_SETS (block),
PHI_RESULT (temp)); PHI_RESULT (temp));
insert_into_set (PHI_GEN (block), bitmap_insert_into_set (PHI_GEN (block),
PHI_RESULT (temp)); PHI_RESULT (temp));
} }
free (avail); free (avail);
...@@ -1576,7 +1594,7 @@ insert (void) ...@@ -1576,7 +1594,7 @@ insert (void)
int num_iterations = 0; int num_iterations = 0;
FOR_ALL_BB (bb) FOR_ALL_BB (bb)
NEW_SETS (bb) = set_new (true); NEW_SETS (bb) = bitmap_set_new ();
while (new_stuff) while (new_stuff)
{ {
...@@ -1612,7 +1630,7 @@ is_undefined_value (tree expr) ...@@ -1612,7 +1630,7 @@ is_undefined_value (tree expr)
any). They are used when computing the hash value for EXPR. */ any). They are used when computing the hash value for EXPR. */
static inline void static inline void
add_to_sets (tree var, tree expr, vuse_optype vuses, value_set_t s1, add_to_sets (tree var, tree expr, vuse_optype vuses, bitmap_set_t s1,
bitmap_set_t s2) bitmap_set_t s2)
{ {
tree val = vn_lookup_or_add (expr, vuses); tree val = vn_lookup_or_add (expr, vuses);
...@@ -1624,7 +1642,7 @@ add_to_sets (tree var, tree expr, vuse_optype vuses, value_set_t s1, ...@@ -1624,7 +1642,7 @@ add_to_sets (tree var, tree expr, vuse_optype vuses, value_set_t s1,
if (var != expr) if (var != expr)
vn_add (var, val, vuses); vn_add (var, val, vuses);
insert_into_set (s1, var); bitmap_insert_into_set (s1, var);
bitmap_value_insert_into_set (s2, var); bitmap_value_insert_into_set (s2, var);
} }
...@@ -1702,7 +1720,7 @@ compute_avail (basic_block block) ...@@ -1702,7 +1720,7 @@ compute_avail (basic_block block)
tree val; tree val;
tree def = default_def (param); tree def = default_def (param);
val = vn_lookup_or_add (def, NULL); val = vn_lookup_or_add (def, NULL);
insert_into_set (TMP_GEN (block), def); bitmap_insert_into_set (TMP_GEN (block), def);
bitmap_value_insert_into_set (AVAIL_OUT (block), def); bitmap_value_insert_into_set (AVAIL_OUT (block), def);
} }
} }
...@@ -1721,8 +1739,11 @@ compute_avail (basic_block block) ...@@ -1721,8 +1739,11 @@ compute_avail (basic_block block)
/* Generate values for PHI nodes. */ /* Generate values for PHI nodes. */
for (phi = phi_nodes (block); phi; phi = PHI_CHAIN (phi)) for (phi = phi_nodes (block); phi; phi = PHI_CHAIN (phi))
add_to_sets (PHI_RESULT (phi), PHI_RESULT (phi), NULL, /* We have no need for virtual phis, as they don't represent
PHI_GEN (block), AVAIL_OUT (block)); actual computations. */
if (is_gimple_reg (PHI_RESULT (phi)))
add_to_sets (PHI_RESULT (phi), PHI_RESULT (phi), NULL,
PHI_GEN (block), AVAIL_OUT (block));
/* Now compute value numbers and populate value sets with all /* Now compute value numbers and populate value sets with all
the expressions computed in BLOCK. */ the expressions computed in BLOCK. */
...@@ -1894,8 +1915,8 @@ init_pre (void) ...@@ -1894,8 +1915,8 @@ init_pre (void)
FOR_ALL_BB (bb) FOR_ALL_BB (bb)
{ {
EXP_GEN (bb) = set_new (true); EXP_GEN (bb) = set_new (true);
PHI_GEN (bb) = set_new (true); PHI_GEN (bb) = bitmap_set_new ();
TMP_GEN (bb) = set_new (false); TMP_GEN (bb) = bitmap_set_new ();
AVAIL_OUT (bb) = bitmap_set_new (); AVAIL_OUT (bb) = bitmap_set_new ();
} }
} }
...@@ -1944,7 +1965,8 @@ execute_pre (bool do_fre) ...@@ -1944,7 +1965,8 @@ execute_pre (bool do_fre)
FOR_ALL_BB (bb) FOR_ALL_BB (bb)
{ {
print_value_set (dump_file, EXP_GEN (bb), "exp_gen", bb->index); print_value_set (dump_file, EXP_GEN (bb), "exp_gen", bb->index);
print_value_set (dump_file, TMP_GEN (bb), "tmp_gen", bb->index); bitmap_print_value_set (dump_file, TMP_GEN (bb), "tmp_gen",
bb->index);
bitmap_print_value_set (dump_file, AVAIL_OUT (bb), "avail_out", bitmap_print_value_set (dump_file, AVAIL_OUT (bb), "avail_out",
bb->index); bb->index);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment