@@ -43,7 +43,7 @@ struct object_size_info
int object_size_type;
unsigned char pass;
bool changed;
- bitmap visited, reexamine, unknowns;
+ bitmap visited, reexamine;
unsigned int *depths;
unsigned int *stack, *tos;
};
@@ -264,19 +264,8 @@ object_sizes_set (struct object_size_info *osi, unsigned varno, tree val,
{
if (bitmap_bit_p (osi->reexamine, varno))
{
- if (size_unknown_p (val, object_size_type))
- {
- oldval = object_sizes_get (osi, varno);
- old_wholeval = object_sizes_get (osi, varno, true);
- bitmap_set_bit (osi->unknowns, SSA_NAME_VERSION (oldval));
- bitmap_set_bit (osi->unknowns, SSA_NAME_VERSION (old_wholeval));
- bitmap_clear_bit (osi->reexamine, varno);
- }
- else
- {
- val = bundle_sizes (oldval, val);
- wholeval = bundle_sizes (old_wholeval, wholeval);
- }
+ val = bundle_sizes (oldval, val);
+ wholeval = bundle_sizes (old_wholeval, wholeval);
}
else
{
@@ -958,25 +947,26 @@ emit_phi_nodes (gimple *stmt, tree size, tree wholesize)
size_unknown, as noted in UNKNOWNS. */
static tree
-propagate_unknowns (object_size_info *osi, tree expr)
+propagate_unknowns (object_size_info *osi, tree expr, bitmap unknowns)
{
int object_size_type = osi->object_size_type;
switch (TREE_CODE (expr))
{
case SSA_NAME:
- if (bitmap_bit_p (osi->unknowns, SSA_NAME_VERSION (expr)))
+ if (bitmap_bit_p (unknowns, SSA_NAME_VERSION (expr)))
return size_unknown (object_size_type);
return expr;
case MIN_EXPR:
case MAX_EXPR:
{
- tree res = propagate_unknowns (osi, TREE_OPERAND (expr, 0));
+ tree res = propagate_unknowns (osi, TREE_OPERAND (expr, 0),
+ unknowns);
if (size_unknown_p (res, object_size_type))
return res;
- res = propagate_unknowns (osi, TREE_OPERAND (expr, 1));
+ res = propagate_unknowns (osi, TREE_OPERAND (expr, 1), unknowns);
if (size_unknown_p (res, object_size_type))
return res;
@@ -984,7 +974,8 @@ propagate_unknowns (object_size_info *osi, tree expr)
}
case MODIFY_EXPR:
{
- tree res = propagate_unknowns (osi, TREE_OPERAND (expr, 1));
+ tree res = propagate_unknowns (osi, TREE_OPERAND (expr, 1),
+ unknowns);
if (size_unknown_p (res, object_size_type))
return res;
return expr;
@@ -992,7 +983,8 @@ propagate_unknowns (object_size_info *osi, tree expr)
case TREE_VEC:
for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
{
- tree res = propagate_unknowns (osi, TREE_VEC_ELT (expr, i));
+ tree res = propagate_unknowns (osi, TREE_VEC_ELT (expr, i),
+ unknowns);
if (size_unknown_p (res, object_size_type))
return res;
}
@@ -1000,7 +992,8 @@ propagate_unknowns (object_size_info *osi, tree expr)
case PLUS_EXPR:
case MINUS_EXPR:
{
- tree res = propagate_unknowns (osi, TREE_OPERAND (expr, 0));
+ tree res = propagate_unknowns (osi, TREE_OPERAND (expr, 0),
+ unknowns);
if (size_unknown_p (res, object_size_type))
return res;
@@ -1025,6 +1018,7 @@ gimplify_size_expressions (object_size_info *osi)
/* Step 1: Propagate unknowns into expressions. */
bitmap reexamine = BITMAP_ALLOC (NULL);
bitmap_copy (reexamine, osi->reexamine);
+ bitmap unknowns = BITMAP_ALLOC (NULL);
do
{
changed = false;
@@ -1032,14 +1026,23 @@ gimplify_size_expressions (object_size_info *osi)
{
object_size cur = object_sizes_get_raw (osi, i);
- if (size_unknown_p (propagate_unknowns (osi, cur.size),
+ if (size_unknown_p (propagate_unknowns (osi, cur.size, unknowns),
object_size_type)
- || size_unknown_p (propagate_unknowns (osi, cur.wholesize),
+ || size_unknown_p (propagate_unknowns (osi, cur.wholesize,
+ unknowns),
object_size_type))
{
- object_sizes_set (osi, i,
- size_unknown (object_size_type),
- size_unknown (object_size_type));
+ /* Record the SSAs we're overwriting to propagate the
+ unknwons. */
+ tree oldval = object_sizes_get (osi, i);
+ tree old_wholeval = object_sizes_get (osi, i, true);
+
+ bitmap_set_bit (unknowns, SSA_NAME_VERSION (oldval));
+ bitmap_set_bit (unknowns, SSA_NAME_VERSION (old_wholeval));
+ object_sizes_initialize (osi, i,
+ size_unknown (object_size_type),
+ size_unknown (object_size_type));
+ bitmap_clear_bit (osi->reexamine, i);
changed = true;
}
}
@@ -1048,9 +1051,12 @@ gimplify_size_expressions (object_size_info *osi)
while (changed);
/* Release all unknowns. */
- EXECUTE_IF_SET_IN_BITMAP (osi->unknowns, 0, i, bi)
+ EXECUTE_IF_SET_IN_BITMAP (unknowns, 0, i, bi)
release_ssa_name (ssa_name (i));
+ BITMAP_FREE (unknowns);
+ BITMAP_FREE (reexamine);
+
/* Expand all size expressions to put their definitions close to the objects
for which size is being computed. */
EXECUTE_IF_SET_IN_BITMAP (osi->reexamine, 0, i, bi)
@@ -1176,9 +1182,7 @@ compute_builtin_object_size (tree ptr, int object_size_type,
osi.visited = BITMAP_ALLOC (NULL);
osi.reexamine = BITMAP_ALLOC (NULL);
- if (object_size_type & OST_DYNAMIC)
- osi.unknowns = BITMAP_ALLOC (NULL);
- else
+ if (!(object_size_type & OST_DYNAMIC))
{
osi.depths = NULL;
osi.stack = NULL;
@@ -1199,7 +1203,6 @@ compute_builtin_object_size (tree ptr, int object_size_type,
{
osi.pass = 1;
gimplify_size_expressions (&osi);
- BITMAP_FREE (osi.unknowns);
bitmap_clear (osi.reexamine);
}