https://gcc.gnu.org/g:72ae35bbc90fea3bb0084187896b783c1451fd22
commit r15-4396-g72ae35bbc90fea3bb0084187896b783c1451fd22 Author: Siddhesh Poyarekar <siddh...@gotplt.org> Date: Tue Sep 17 18:32:52 2024 -0400 tree-object-size: use size_for_offset in more cases When wholesize != size, there is a reasonable opportunity for static object sizes also to be computed using size_for_offset, so use that. gcc/ChangeLog: * tree-object-size.cc (plus_stmt_object_size): Call SIZE_FOR_OFFSET for some negative offset cases. gcc/testsuite/ChangeLog: * gcc.dg/builtin-object-size-3.c (test9): Adjust test. * gcc.dg/builtin-object-size-4.c (test8): Likewise. Signed-off-by: Siddhesh Poyarekar <siddh...@gotplt.org> Diff: --- gcc/testsuite/gcc.dg/builtin-object-size-3.c | 6 +++--- gcc/testsuite/gcc.dg/builtin-object-size-4.c | 6 +++--- gcc/tree-object-size.cc | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-3.c b/gcc/testsuite/gcc.dg/builtin-object-size-3.c index 3f58da3d500c..ec2c62c96401 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-3.c +++ b/gcc/testsuite/gcc.dg/builtin-object-size-3.c @@ -574,7 +574,7 @@ test9 (unsigned cond) if (__builtin_object_size (&p[-4], 2) != (cond ? 6 : 10)) FAIL (); #else - if (__builtin_object_size (&p[-4], 2) != 0) + if (__builtin_object_size (&p[-4], 2) != 6) FAIL (); #endif @@ -585,7 +585,7 @@ test9 (unsigned cond) if (__builtin_object_size (p, 2) != ((cond ? 2 : 6) + cond)) FAIL (); #else - if (__builtin_object_size (p, 2) != 0) + if (__builtin_object_size (p, 2) != 2) FAIL (); #endif @@ -598,7 +598,7 @@ test9 (unsigned cond) != sizeof (y) - __builtin_offsetof (struct A, c) - 8 + cond) FAIL (); #else - if (__builtin_object_size (p, 2) != 0) + if (__builtin_object_size (p, 2) != sizeof (y) - __builtin_offsetof (struct A, c) - 8) FAIL (); #endif } diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-4.c b/gcc/testsuite/gcc.dg/builtin-object-size-4.c index b3eb36efb744..7bcd24c41507 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-4.c +++ b/gcc/testsuite/gcc.dg/builtin-object-size-4.c @@ -482,7 +482,7 @@ test8 (unsigned cond) if (__builtin_object_size (&p[-4], 3) != (cond ? 6 : 10)) FAIL (); #else - if (__builtin_object_size (&p[-4], 3) != 0) + if (__builtin_object_size (&p[-4], 3) != 6) FAIL (); #endif @@ -493,7 +493,7 @@ test8 (unsigned cond) if (__builtin_object_size (p, 3) != ((cond ? 2 : 6) + cond)) FAIL (); #else - if (__builtin_object_size (p, 3) != 0) + if (__builtin_object_size (p, 3) != 2) FAIL (); #endif @@ -505,7 +505,7 @@ test8 (unsigned cond) if (__builtin_object_size (p, 3) != sizeof (y.c) - 8 + cond) FAIL (); #else - if (__builtin_object_size (p, 3) != 0) + if (__builtin_object_size (p, 3) != sizeof (y.c) - 8) FAIL (); #endif } diff --git a/gcc/tree-object-size.cc b/gcc/tree-object-size.cc index 6544730e1539..78faae7ad0d3 100644 --- a/gcc/tree-object-size.cc +++ b/gcc/tree-object-size.cc @@ -1527,6 +1527,7 @@ plus_stmt_object_size (struct object_size_info *osi, tree var, gimple *stmt) if (size_unknown_p (bytes, 0)) ; else if ((object_size_type & OST_DYNAMIC) + || bytes != wholesize || compare_tree_int (op1, offset_limit) <= 0) bytes = size_for_offset (bytes, op1, wholesize); /* In the static case, with a negative offset, the best estimate for