aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-11-06 15:13:56 +0100
committerRichard Biener <rguenther@suse.de>2020-11-06 15:41:04 +0100
commitd398949230786a4d678677fab0070ad779cc1c84 (patch)
tree4f9140fee42f85962b5b44af1c26357e2472706b /gcc/tree-ssa-pre.c
parent22175d0dc6a89ddd630f19d0f32a2d1ddb046807 (diff)
downloadgcc-d398949230786a4d678677fab0070ad779cc1c84.zip
gcc-d398949230786a4d678677fab0070ad779cc1c84.tar.gz
gcc-d398949230786a4d678677fab0070ad779cc1c84.tar.bz2
make PRE constant value IDs negative
This separates constant and non-constant value-ids to allow for a more efficient constant_value_id_p and for more efficient bit-packing inside the bitmap sets which never contain any constant values. There's further optimization opportunities but at this stage I'll do small refactorings. 2020-11-06 Richard Biener <rguenther@suse.de> * tree-ssa-sccvn.h (get_max_constant_value_id): Declare. (get_next_constant_value_id): Likewise. (value_id_constant_p): Inline and simplify. * tree-ssa-sccvn.c (constant_value_ids): Remove. (next_constant_value_id): Add. (get_or_alloc_constant_value_id): Adjust. (value_id_constant_p): Remove definition. (get_max_constant_value_id): Define. (get_next_value_id): Add assert for overflow. (get_next_constant_value_id): Define. (run_rpo_vn): Adjust. (free_rpo_vn): Likewise. (do_rpo_vn): Initialize next_constant_value_id. * tree-ssa-pre.c (constant_value_expressions): New. (add_to_value): Split into constant/non-constant value handling. Avoid exact re-allocation. (vn_valnum_from_value_id): Adjust. (phi_translate_1): Remove spurious exact re-allocation. (bitmap_find_leader): Adjust. Make sure we return a CONSTANT value for a constant value id. (do_pre_regular_insertion): Use 2 auto-elements for avail. (do_pre_partial_partial_insertion): Likewise. (init_pre): Allocate constant_value_expressions. (fini_pre): Release constant_value_expressions.
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r--gcc/tree-ssa-pre.c57
1 files changed, 37 insertions, 20 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 39c52c9..65e8aaa 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -444,6 +444,9 @@ public:
/* Mapping from value id to expressions with that value_id. */
static vec<bitmap> value_expressions;
+/* ??? We want to just record a single expression for each constant
+ value, one of kind CONSTANT. */
+static vec<bitmap> constant_value_expressions;
/* Sets that we need to keep track of. */
typedef struct bb_bitmap_sets
@@ -624,18 +627,30 @@ add_to_value (unsigned int v, pre_expr e)
gcc_checking_assert (get_expr_value_id (e) == v);
- if (v >= value_expressions.length ())
+ if (value_id_constant_p (v))
{
- value_expressions.safe_grow_cleared (v + 1, true);
- }
+ if (-v >= constant_value_expressions.length ())
+ constant_value_expressions.safe_grow_cleared (-v + 1);
- set = value_expressions[v];
- if (!set)
- {
- set = BITMAP_ALLOC (&grand_bitmap_obstack);
- value_expressions[v] = set;
+ set = constant_value_expressions[-v];
+ if (!set)
+ {
+ set = BITMAP_ALLOC (&grand_bitmap_obstack);
+ constant_value_expressions[-v] = set;
+ }
}
+ else
+ {
+ if (v >= value_expressions.length ())
+ value_expressions.safe_grow_cleared (v + 1);
+ set = value_expressions[v];
+ if (!set)
+ {
+ set = BITMAP_ALLOC (&grand_bitmap_obstack);
+ value_expressions[v] = set;
+ }
+ }
bitmap_set_bit (set, get_or_alloc_expression_id (e));
}
@@ -687,7 +702,11 @@ vn_valnum_from_value_id (unsigned int val)
{
bitmap_iterator bi;
unsigned int i;
- bitmap exprset = value_expressions[val];
+ bitmap exprset;
+ if (value_id_constant_p (val))
+ exprset = constant_value_expressions[-val];
+ else
+ exprset = value_expressions[val];
EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
{
pre_expr vexpr = expression_for_id (i);
@@ -1451,8 +1470,6 @@ phi_translate_1 (bitmap_set_t dest,
else
{
new_val_id = get_next_value_id ();
- value_expressions.safe_grow_cleared (get_max_value_id () + 1,
- true);
nary = vn_nary_op_insert_pieces (newnary->length,
newnary->opcode,
newnary->type,
@@ -1603,11 +1620,7 @@ phi_translate_1 (bitmap_set_t dest,
else
{
if (changed || !same_valid)
- {
- new_val_id = get_next_value_id ();
- value_expressions.safe_grow_cleared
- (get_max_value_id () + 1, true);
- }
+ new_val_id = get_next_value_id ();
else
new_val_id = ref->value_id;
if (!newoperands.exists ())
@@ -1745,7 +1758,7 @@ bitmap_find_leader (bitmap_set_t set, unsigned int val)
{
unsigned int i;
bitmap_iterator bi;
- bitmap exprset = value_expressions[val];
+ bitmap exprset = constant_value_expressions[-val];
EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
{
@@ -1753,6 +1766,7 @@ bitmap_find_leader (bitmap_set_t set, unsigned int val)
if (expr->kind == CONSTANT)
return expr;
}
+ gcc_unreachable ();
}
if (bitmap_set_contains_value (set, val))
{
@@ -3190,7 +3204,7 @@ do_pre_regular_insertion (basic_block block, basic_block dom)
bool new_stuff = false;
vec<pre_expr> exprs;
pre_expr expr;
- auto_vec<pre_expr> avail;
+ auto_vec<pre_expr, 2> avail;
int i;
exprs = sorted_array_from_bitmap_set (ANTIC_IN (block));
@@ -3357,7 +3371,7 @@ do_pre_partial_partial_insertion (basic_block block, basic_block dom)
bool new_stuff = false;
vec<pre_expr> exprs;
pre_expr expr;
- auto_vec<pre_expr> avail;
+ auto_vec<pre_expr, 2> avail;
int i;
exprs = sorted_array_from_bitmap_set (PA_IN (block));
@@ -4111,7 +4125,9 @@ init_pre (void)
expressions.create (0);
expressions.safe_push (NULL);
value_expressions.create (get_max_value_id () + 1);
- value_expressions.safe_grow_cleared (get_max_value_id () + 1, true);
+ value_expressions.quick_grow_cleared (get_max_value_id () + 1);
+ constant_value_expressions.create (get_max_constant_value_id () + 1);
+ constant_value_expressions.quick_grow_cleared (get_max_constant_value_id () + 1);
name_to_id.create (0);
inserted_exprs = BITMAP_ALLOC (NULL);
@@ -4142,6 +4158,7 @@ static void
fini_pre ()
{
value_expressions.release ();
+ constant_value_expressions.release ();
expressions.release ();
BITMAP_FREE (inserted_exprs);
bitmap_obstack_release (&grand_bitmap_obstack);