$ cat test.c struct a { int b; short c; }; int d; void e() { struct a f[1]; f[d] = f[d]; } $ ./aarch64-none-elf-gcc -O1 -c test.c during GIMPLE pass: esra test.c: In function 'e': test.c:9:1: internal compiler error: in verify_sra_access_forest, at tree-sra.c:2360 9 | } | ^ 0xea37a2 verify_sra_access_forest(access*) /home/delbur01/gnu-work/src/gcc/gcc/tree-sra.c:2359 0xea609b verify_all_sra_access_forests() /home/delbur01/gnu-work/src/gcc/gcc/tree-sra.c:2407 0xea9b7a analyze_all_variable_accesses /home/delbur01/gnu-work/src/gcc/gcc/tree-sra.c:3448 0xeaaa44 perform_intra_sra /home/delbur01/gnu-work/src/gcc/gcc/tree-sra.c:4502 0xeac2c2 early_intra_sra /home/delbur01/gnu-work/src/gcc/gcc/tree-sra.c:4532 0xeac2c2 execute /home/delbur01/gnu-work/src/gcc/gcc/tree-sra.c:4575 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions.
Confirmed on x86_64-linux-gnu, started with r10-6321-g636e80eea24b780f.
For arrays of size 1, get_ref_base_and_extent knows that the expression can only access the one element even if the index is a variable. It seems it does not happen if the ARRAY_REF is within a COMPONENT_REF, an expression created by new total scalarization. I'll adjust the assert for GCC 10 but will also have a look at why get_ref_base_and_extent does that.
I'm going to test the following: --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -2357,9 +2357,11 @@ verify_sra_access_forest (struct access *root) gcc_assert (base == first_base); gcc_assert (offset == access->offset); gcc_assert (access->grp_unscalarizable_region + || access->grp_total_scalarization || size == max_size); - gcc_assert (!is_gimple_reg_type (access->type) - || max_size == access->size); + gcc_assert (!access->grp_unscalarizable_region + || !is_gimple_reg_type (access->type) + || size == access->size); gcc_assert (reverse == access->reverse); if (access->first_child)
I proposed the fix on the mailing list: https://gcc.gnu.org/pipermail/gcc-patches/2020-April/543909.html (Note that the one in comment #3 has a small but important typo.)
The master branch has been updated by Martin Jambor <jamborm@gcc.gnu.org>: https://gcc.gnu.org/g:bd87b1fddbbe7d424671ebf81c96e12d748fafc7 commit r10-7751-gbd87b1fddbbe7d424671ebf81c96e12d748fafc7 Author: Martin Jambor <mjambor@suse.cz> Date: Thu Apr 16 11:04:41 2020 +0200 sra: Fix access verification (PR 94598) get_ref_base_and_extent recognizes ARRAY_REFs with variable index but into arrays of length one as constant offset accesses. However, max_size in such cases is extended to span the whole element. This confuses SRA verification when SRA also builds its (total scalarization) access structures to describe fields under such array - get_ref_base_and_extent returns different size and max_size for them. Fixed by not performing the check for total scalarization accesses. The subsequent check then had to be changed to use size and not max_size too, which meant it has to be skipped when the access structure describes a genuine variable array access. Bootstrapped and tested on x86_64-linux. 2020-04-16 Martin Jambor <mjambor@suse.cz> PR tree-optimization/94598 * tree-sra.c (verify_sra_access_forest): Fix verification of total scalarization accesses under access to one-element arrays. testsuite/ * gcc.dg/tree-ssa/pr94598.c: New test.
Fixed, thanks for reporting.