[PATCH] avoid assuming known string length is constant (PR 83896)

Richard Sandiford richard.sandiford@linaro.org
Tue Jan 16 19:39:00 GMT 2018


Martin Sebor <msebor@gmail.com> writes:
> Recent improvements to the strlen pass introduced the assumption
> that when the length of a string has been recorded by the pass
> the length is necessarily constant.  Bug 83896 shows that this
> assumption is not always true, and that GCC fails with an ICE
> when it doesn't hold.  To avoid the ICE the attached patch
> removes the assumption.
>
> x86_64-linux bootstrap successful, regression test in progress.
>
> Martin
>
> PR tree-optimization/83896 - ice in get_string_len on a call to strlen with non-constant length
>
> gcc/ChangeLog:
>
> 	PR tree-optimization/83896
> 	* tree-ssa-strlen.c (get_string_len): Avoid assuming length is constant.
>
> gcc/testsuite/ChangeLog:
>
> 	PR tree-optimization/83896
> 	* gcc.dg/strlenopt-43.c: New test.
>
> Index: gcc/tree-ssa-strlen.c
> ===================================================================
> --- gcc/tree-ssa-strlen.c	(revision 256752)
> +++ gcc/tree-ssa-strlen.c	(working copy)
> @@ -2772,7 +2772,9 @@ handle_pointer_plus (gimple_stmt_iterator *gsi)
>      }
>  }
>  
> -/* Check if RHS is string_cst possibly wrapped by mem_ref.  */
> +/* If RHS, either directly or indirectly, refers to a string of constant
> +   length, return it.  Otherwise return a negative value.  */
> +
>  static int
>  get_string_len (tree rhs)
>  {

I think this should be returning HOST_WIDE_INT given the unconstrained
tree_to_shwi return.  Same type change for rhslen in the caller.

(Not my call, but it might be better to have a more specific function name,
given that the file already had "get_string_length" before this function
was added.)

> @@ -2789,7 +2791,8 @@ get_string_len (tree rhs)
>  	      if (idx > 0)
>  		{
>  		  strinfo *si = get_strinfo (idx);
> -		  if (si && si->full_string_p)
> +		  if (si && si->full_string_p
> +		      && TREE_CODE (si->nonzero_chars) == INTEGER_CST)
>  		    return tree_to_shwi (si->nonzero_chars);

tree_fits_shwi_p?

Thanks,
Richard

>  		}
>  	    }
> Index: gcc/testsuite/gcc.dg/strlenopt-43.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/strlenopt-43.c	(nonexistent)
> +++ gcc/testsuite/gcc.dg/strlenopt-43.c	(working copy)
> @@ -0,0 +1,13 @@
> +/* PR tree-optimization/83896 - ice in get_string_len on a call to strlen
> +   with non-constant length
> +   { dg-do compile }
> +   { dg-options "-O2 -Wall" } */
> +
> +extern char a[5];
> +extern char b[];
> +
> +void f (void)
> +{
> +  if (__builtin_strlen (b) != 4)
> +    __builtin_memcpy (a, b, sizeof a);
> +}



More information about the Gcc-patches mailing list