On Wed, Nov 10, 2021 at 12:31:30AM +0530, Siddhesh Poyarekar wrote:
> Use SSA names as placeholders self-referencing variables to generate
> expressions for object sizes and then reduce those size expressions
> to constants instead of repeatedly walking through statements.
> 
> This change also makes sure that object sizes for an SSA name are
> updated at most twice, once if there is a dependency loop and then the
> final time upon computation of object size.  Iteration to deduce the
> final size is now done on the size expressions instead of walking
> through the object references.
> 
> Added test to include a case where __builtin_object_size incorrectly
> returned the minimum object size as zero.

This feels way too risky to me.  I think making some code do something
different between (x & OST_DYNAMIC) == 0 and == 1 is just fine,
it doesn't have to share everything.  After all, for __bdos we actually
emit code to compute it at runtime, while for __bos we don't.
So I'd keep e.g. .pass = 0, .pass = 1 and .pass = 2 (in a loop) in
compute_builtin_object_size for non-OST_DYNAMIC and only use your new
stuff for __bdos.
E.g. creating new SSA_NAMEs for __bos doesn't look like a good idea to me.
The GCC __bos testsuite is not big enough that it covers everything and
even in it we sometimes reexamine 2, 3 or 4 times.

> gcc/ChangeLog:
> 
>       * tree-object-size.c (struct object_size_info): Remove pass,
>       changed, depths, stack and tos.  Add tempsize_objs.
>       (OST_TREE_CODE): New macro.
>       (expr_object_size, merge_object_sizes, plus_stmt_object_size,
>       cond_expr_object_size): Return tree and don't pass pointer tree.
>       (object_sizes_set): Return void.  Adjust implementation to hold
>       placeholder SSA names and their values in different slots.
>       (addr_object_size): Adjust for single pass.
>       (reducing_size, estimate_size, resolve_dependency_loops): New
>       functions.
>       (compute_builtin_object_size): Call them.
>       (make_tempsize): New function.
>       (collect_object_sizes_for): Use it.  Update object_sizes at most
>       twice.
>       (check_for_plus_in_loops, check_for_plus_in_loops_1): Remove
>       functions.
> 
> gcc/testsuite/ChangeLog:
> 
>       * gcc.dg/builtin-object-size-1.c (test6): New test for
>       passthrough.
>       * gcc.dg/builtin-object-size-2.c: Likewise.
>       * gcc.dg/builtin-object-size-3.c: Likewise.
>       * gcc.dg/builtin-object-size-4.c: Likewise.

        Jakub

Reply via email to