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