[PATCH] array-bounds, v2: Fix up ICE on overaligned variables [PR99109]
Richard Biener
rguenther@suse.de
Thu Feb 18 08:41:26 GMT 2021
On Thu, 18 Feb 2021, Jakub Jelinek wrote:
> On Wed, Feb 17, 2021 at 02:38:04PM -0700, Martin Sebor via Gcc-patches wrote:
> > How does build_printable_array_type sound?
>
> This adjusted version also works and has been successfully
> bootstrapped/regtested on x86_64-linux and i686-linux.
>
> Ok for trunk?
OK.
Richard.
> 2021-02-18 Jakub Jelinek <jakub@redhat.com>
>
> PR middle-end/99109
> * gimple-array-bounds.cc (build_zero_elt_array_type): Rename to ...
> (build_printable_array_type): ... this. Add nelts argument. For
> overaligned eltype, use TYPE_MAIN_VARIANT (eltype) instead. If
> nelts, call build_array_type_nelts.
> (array_bounds_checker::check_mem_ref): Use build_printable_array_type
> instead of build_zero_elt_array_type and build_array_type_nelts.
>
> * g++.dg/warn/Warray-bounds-17.C: New test.
>
> --- gcc/gimple-array-bounds.cc.jj 2021-01-04 10:25:37.471249246 +0100
> +++ gcc/gimple-array-bounds.cc 2021-02-17 23:30:34.168721374 +0100
> @@ -372,12 +372,23 @@ array_bounds_checker::check_array_ref (l
> return warned;
> }
>
> -/* Hack around the internal representation constraints and build a zero
> - element array type that actually renders as T[0] in diagnostcs. */
> +/* Wrapper around build_array_type_nelts that makes sure the array
> + can be created at all and handles zero sized arrays specially. */
>
> static tree
> -build_zero_elt_array_type (tree eltype)
> +build_printable_array_type (tree eltype, unsigned HOST_WIDE_INT nelts)
> {
> + if (TYPE_SIZE_UNIT (eltype)
> + && TREE_CODE (TYPE_SIZE_UNIT (eltype)) == INTEGER_CST
> + && !integer_zerop (TYPE_SIZE_UNIT (eltype))
> + && TYPE_ALIGN_UNIT (eltype) > 1
> + && wi::zext (wi::to_wide (TYPE_SIZE_UNIT (eltype)),
> + ffs_hwi (TYPE_ALIGN_UNIT (eltype)) - 1) != 0)
> + eltype = TYPE_MAIN_VARIANT (eltype);
> +
> + if (nelts)
> + return build_array_type_nelts (eltype, nelts);
> +
> tree idxtype = build_range_type (sizetype, size_zero_node, NULL_TREE);
> tree arrtype = build_array_type (eltype, idxtype);
> arrtype = build_distinct_type_copy (TYPE_MAIN_VARIANT (arrtype));
> @@ -561,10 +572,7 @@ array_bounds_checker::check_mem_ref (loc
> return false;
>
> offset_int nelts = arrbounds[1] / eltsize;
> - if (nelts == 0)
> - reftype = build_zero_elt_array_type (reftype);
> - else
> - reftype = build_array_type_nelts (reftype, nelts.to_uhwi ());
> + reftype = build_printable_array_type (reftype, nelts.to_uhwi ());
> }
> else if (TREE_CODE (arg) == ADDR_EXPR)
> {
> @@ -675,7 +683,7 @@ array_bounds_checker::check_mem_ref (loc
> /* Treat a reference to a non-array object as one to an array
> of a single element. */
> if (TREE_CODE (reftype) != ARRAY_TYPE)
> - reftype = build_array_type_nelts (reftype, 1);
> + reftype = build_printable_array_type (reftype, 1);
>
> /* Extract the element type out of MEM_REF and use its size
> to compute the index to print in the diagnostic; arrays
> --- gcc/testsuite/g++.dg/warn/Warray-bounds-17.C.jj 2021-02-16 17:24:14.178813304 +0100
> +++ gcc/testsuite/g++.dg/warn/Warray-bounds-17.C 2021-02-16 17:23:35.305251062 +0100
> @@ -0,0 +1,15 @@
> +// PR middle-end/99109
> +// { dg-do compile }
> +// { dg-options "-O2 -Warray-bounds" }
> +
> +typedef int A __attribute__((aligned (64)));
> +void foo (int *);
> +
> +void
> +bar (void)
> +{
> + A b; // { dg-message "while referencing" }
> + int *p = &b;
> + int *x = (p - 1); // { dg-warning "outside array bounds" }
> + foo (x);
> +}
>
>
> Jakub
>
>
--
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)
More information about the Gcc-patches
mailing list