On Fri, 28 Aug 2020, Martin Jambor wrote:

> Hi,
> 
> the testcase causes and ICE in the SRA verifier on x86_64 when
> compiling with -m32 because build_user_friendly_ref_for_offset looks
> at an out-of-bounds array_ref within an array_ref which accesses an
> offset which does not fit into a signed 32bit integer and turns it
> into an array-ref with a negative index.
> 
> The best thing is probably to bail out early when encountering an out
> of bounds access to a local stack-allocated aggregate (and let the DSE
> just delete such statements) which is what the patch does.
> 
> I also glanced over to the initial candidate vetting routine to make
> sure the size would fit into HWI and noticed that it uses unsigned
> variants whereas the rest of SRA operates on signed offsets and
> sizes (because get_ref_and_extent does) and so changed that for the
> sake of consistency.  These ancient checks operate on sizes of types
> as opposed to DECLs but I hope that any issues potentially arising
> from that are basically hypothetical.
> 
> Bootstrapped and tested on x86_64-linux.  OK for master and then for
> gcc-10 branch?

OK.

Richard.

> Thanks,
> 
> Martin
> 
> 
> gcc/ChangeLog:
> 
> 2020-08-28  Martin Jambor  <mjam...@suse.cz>
> 
>       PR tree-optimization/96820
>       * tree-sra.c (create_access): Disqualify candidates with accesses
>       beyond the end of the original aggregate.
>       (maybe_add_sra_candidate): Check that candidate type size fits
>       signed uhwi for the sake of consistency.
> 
> gcc/testsuite/ChangeLog:
> 
> 2020-08-28  Martin Jambor  <mjam...@suse.cz>
> 
>       PR tree-optimization/96820
>       * gcc.dg/tree-ssa/pr96820.c: New test.
> ---
>  gcc/testsuite/gcc.dg/tree-ssa/pr96820.c | 12 ++++++++++++
>  gcc/tree-sra.c                          |  9 +++++++--
>  2 files changed, 19 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr96820.c
> 
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr96820.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/pr96820.c
> new file mode 100644
> index 00000000000..f5c2195f310
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr96820.c
> @@ -0,0 +1,12 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1" } */
> +
> +struct a {
> +  int b;
> +};
> +int main() {
> +  struct a d[][6] = {4};
> +  struct a e;
> +  d[1955249013][1955249013] = e;
> +  return e.b;
> +}
> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
> index 754f41302fc..98a6cacbe2a 100644
> --- a/gcc/tree-sra.c
> +++ b/gcc/tree-sra.c
> @@ -941,6 +941,11 @@ create_access (tree expr, gimple *stmt, bool write)
>        disqualify_candidate (base, "Encountered an unconstrained access.");
>        return NULL;
>      }
> +  if (offset + size > tree_to_shwi (DECL_SIZE (base)))
> +    {
> +      disqualify_candidate (base, "Encountered an access beyond the base.");
> +      return NULL;
> +    }
>  
>    access = create_access_1 (base, offset, size);
>    access->expr = expr;
> @@ -1880,12 +1885,12 @@ maybe_add_sra_candidate (tree var)
>        reject (var, "has incomplete type");
>        return false;
>      }
> -  if (!tree_fits_uhwi_p (TYPE_SIZE (type)))
> +  if (!tree_fits_shwi_p (TYPE_SIZE (type)))
>      {
>        reject (var, "type size not fixed");
>        return false;
>      }
> -  if (tree_to_uhwi (TYPE_SIZE (type)) == 0)
> +  if (tree_to_shwi (TYPE_SIZE (type)) == 0)
>      {
>        reject (var, "type size is zero");
>        return false;
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to