On Thu, Oct 21, 2021 at 12:57 PM Martin Jambor <mjam...@suse.cz> wrote:
>
> Hi,
>
> PR 102505 is a situation where of SRA takes its initial top-level
> access size from a get_ref_base_and_extent called on a COMPONENT_REF,
> and thus derived frm the FIELD_DECL, which however does not include a
> virtual base.  Total scalarization then goes on traversing the type,
> which however has virtual base past the non-virtual bits, tricking SRA
> to create sub-accesses outside of the supposedly encompassing
> accesses, which in turn triggers the verifier within the pass.
>
> The patch below fixes that by failing total scalarization when this
> situation is detected.
>
> Bootstrapped and tested on x86_64-linux, OK for trunk and (after testing
> there) on the branches?

OK.

> Thanks,
>
> Martin
>
>
> gcc/ChangeLog:
>
> 2021-10-20  Martin Jambor  <mjam...@suse.cz>
>
>         PR tree-optimization/102505
>         * tree-sra.c (totally_scalarize_subtree): Check that the
>         encountered field fits within the acces we would like to put it
>         in.
>
> gcc/testsuite/ChangeLog:
>
> 2021-10-20  Martin Jambor  <mjam...@suse.cz>
>
>         PR tree-optimization/102505
>         * g++.dg/torture/pr102505.C: New test.
> ---
>  gcc/testsuite/g++.dg/torture/pr102505.C | 15 +++++++++++++++
>  gcc/tree-sra.c                          |  2 ++
>  2 files changed, 17 insertions(+)
>  create mode 100644 gcc/testsuite/g++.dg/torture/pr102505.C
>
> diff --git a/gcc/testsuite/g++.dg/torture/pr102505.C 
> b/gcc/testsuite/g++.dg/torture/pr102505.C
> new file mode 100644
> index 00000000000..a846751a0d6
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/torture/pr102505.C
> @@ -0,0 +1,15 @@
> +struct D  { int i;  int pad alignas(16); };
> +struct B : virtual D
> +{
> +  int j =84;
> +  int k =84;
> +};
> +
> +struct C: B { };
> +
> +int main()
> +{
> +  C c;
> +  if (c.j != 84 || c.k != 84)
> +    __builtin_abort();
> +}
> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
> index 9b786e29e4e..f561e1a2133 100644
> --- a/gcc/tree-sra.c
> +++ b/gcc/tree-sra.c
> @@ -3288,6 +3288,8 @@ totally_scalarize_subtree (struct access *root)
>               continue;
>
>             HOST_WIDE_INT pos = root->offset + int_bit_position (fld);
> +           if (pos + fsize > root->size)
> +             return false;
>             enum total_sra_field_state
>               state = total_should_skip_creating_access (root,
>                                                          &last_seen_sibling,
> --
> 2.33.0
>

Reply via email to