tree-object-size: Support dynamic sizes in conditions
authorSiddhesh Poyarekar <siddhesh@gotplt.org>
Mon, 10 Jan 2022 23:57:51 +0000 (05:27 +0530)
committerSiddhesh Poyarekar <siddhesh@gotplt.org>
Tue, 11 Jan 2022 14:46:55 +0000 (20:16 +0530)
commit404c787e2bfe8cae666b075ed903990ea452220e
tree61a286b541c75333e0b9110a5c6fa1fec842ab14
parent026d44cbbd42653908f9faf6b80773f03e1bb1a0
tree-object-size: Support dynamic sizes in conditions

Handle GIMPLE_PHI and conditionals specially for dynamic objects,
returning PHI/conditional expressions instead of just a MIN/MAX
estimate.

This makes the returned object size variable for loops and conditionals,
so tests need to be adjusted to look for precise size in some cases.
builtin-dynamic-object-size-5.c had to be modified to only look for
success in maximum object size case and skip over the minimum object
size tests because the result is no longer a compile time constant.

I also added some simple tests to exercise conditionals with dynamic
object sizes.

gcc/ChangeLog:

PR middle-end/70090
* builtins.c (fold_builtin_object_size): Adjust for dynamic size
expressions.
* tree-object-size.c: Include gimplify-me.h.
(struct object_size_info): New member UNKNOWNS.
(size_initval_p, size_usable_p, object_sizes_get_raw): New
functions.
(object_sizes_get): Return suitable gimple variable for
object size.
(bundle_sizes): New function.
(object_sizes_set): Use it and handle dynamic object size
expressions.
(object_sizes_set_temp): New function.
(size_for_offset): Adjust for dynamic size expressions.
(emit_phi_nodes, propagate_unknowns, gimplify_size_expressions):
New functions.
(compute_builtin_object_size): Call gimplify_size_expressions
for OST_DYNAMIC.
(dynamic_object_size): New function.
(cond_expr_object_size): Use it.
(phi_dynamic_object_size): New function.
(collect_object_sizes_for): Call it for OST_DYNAMIC.  Adjust to
accommodate dynamic object sizes.

gcc/testsuite/ChangeLog:

PR middle-end/70090
* gcc.dg/builtin-dynamic-object-size-0.c: New tests.
* gcc.dg/builtin-dynamic-object-size-10.c: Add comment.
* gcc.dg/builtin-dynamic-object-size-5-main.c: New file.
* gcc.dg/builtin-dynamic-object-size-5.c: Use it and change test
to dg-do run.
* gcc.dg/builtin-object-size-5.c [!N]: Define N.
(test1, test2, test3, test4) [__builtin_object_size]: Expect
exact result for __builtin_dynamic_object_size.
* gcc.dg/builtin-object-size-1.c [__builtin_object_size]: Expect
exact size expressions for __builtin_dynamic_object_size.
* gcc.dg/builtin-object-size-2.c [__builtin_object_size]:
Likewise.
* gcc.dg/builtin-object-size-3.c [__builtin_object_size]:
Likewise.
* gcc.dg/builtin-object-size-4.c [__builtin_object_size]:
Likewise.

Signed-off-by: Siddhesh Poyarekar <siddhesh@gotplt.org>
gcc/builtins.c
gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/builtin-dynamic-object-size-10.c
gcc/testsuite/gcc.dg/builtin-dynamic-object-size-5-main.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/builtin-dynamic-object-size-5.c
gcc/testsuite/gcc.dg/builtin-object-size-1.c
gcc/testsuite/gcc.dg/builtin-object-size-2.c
gcc/testsuite/gcc.dg/builtin-object-size-3.c
gcc/testsuite/gcc.dg/builtin-object-size-4.c
gcc/testsuite/gcc.dg/builtin-object-size-5.c
gcc/tree-object-size.c