Bug 94598 - [10 Regression] ICE in verify_sra_access_forest, at tree-sra.c:2360 with -O1 or higher since r10-6321-g636e80eea24b780f
Summary: [10 Regression] ICE in verify_sra_access_forest, at tree-sra.c:2360 with -O1 ...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 10.0
: P1 normal
Target Milestone: 10.0
Assignee: Martin Jambor
URL:
Keywords: ice-on-valid-code
Depends on:
Blocks:
 
Reported: 2020-04-14 17:50 UTC by Delia Burduv
Modified: 2021-09-27 22:01 UTC (History)
2 users (show)

See Also:
Host:
Target: aarch64-none-elf, x86_64-linux-gnu
Build:
Known to work: 9.3.0
Known to fail: 10.0
Last reconfirmed: 2020-04-15 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Delia Burduv 2020-04-14 17:50:59 UTC
$ 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.
Comment 1 Martin Liška 2020-04-15 05:27:39 UTC
Confirmed on x86_64-linux-gnu, started with r10-6321-g636e80eea24b780f.
Comment 2 Martin Jambor 2020-04-15 10:02:37 UTC
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.
Comment 3 Martin Jambor 2020-04-15 13:38:52 UTC
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)
Comment 4 Martin Jambor 2020-04-15 15:34:38 UTC
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.)
Comment 5 GCC Commits 2020-04-16 09:07:18 UTC
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.
Comment 6 Martin Jambor 2020-04-16 09:40:52 UTC
Fixed, thanks for reporting.