Linsen Zhou <[email protected]> writes:

> After commit 51b85dfeb19652bf3e0aaec08828ba7cee1e641c, when the pointer
> offset is a variable in the loop, the object size of point may also need
> to be reexamined.
> Which make gcc_assert in the check_for_plus_in_loops failed.
>
> gcc/ChangeLog:
>
>         tree-object-size.cc (check_for_plus_in_loops): Skip check for
>         the variable offset
>
> Signed-off-by: Linsen Zhou <[email protected]>
> ---

Could you add a testcase to the patch, and also add a reference to
PR122012 in the commit message and in the ChangeLog?

I can't review this though, cc'd Sid whose patch exposed this.

>
> Related Alpine Linux issues:
>
> https://gitlab.alpinelinux.org/alpine/aports/-/issues/17416  
> https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/87912  
>
>  gcc/tree-object-size.cc | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/tree-object-size.cc b/gcc/tree-object-size.cc
> index 8545eff61a3..413e67a8125 100644
> --- a/gcc/tree-object-size.cc
> +++ b/gcc/tree-object-size.cc
> @@ -2147,10 +2147,9 @@ check_for_plus_in_loops (struct object_size_info *osi, 
> tree var)
>        tree basevar = gimple_assign_rhs1 (stmt);
>        tree cst = gimple_assign_rhs2 (stmt);
>  
> -      gcc_assert (TREE_CODE (cst) == INTEGER_CST);
> -

I think keeping the tree in 'cst' is confusing if we can on longer rely
on it being a constant expression, but please let others comment first.

>        /* Skip non-positive offsets.  */
> -      if (integer_zerop (cst) || compare_tree_int (cst, offset_limit) > 0)
> +      if (TREE_CODE (cst) != INTEGER_CST
> +       || integer_zerop (cst) || compare_tree_int (cst, offset_limit) > 0)
>          return;
>  
>        osi->depths[SSA_NAME_VERSION (basevar)] = 1;
> -- 
> 2.51.0

Reply via email to