sra: Avoid totally scalarizing overallping field_decls (PR 93667)
authorMartin Jambor <mjambor@suse.cz>
Wed, 19 Feb 2020 10:08:40 +0000 (11:08 +0100)
committerMartin Jambor <mjambor@suse.cz>
Wed, 19 Feb 2020 10:08:40 +0000 (11:08 +0100)
commit665c5bad168ab63629b29ed2ce08ed042c088dc2
treeecb4038880ce3d049ab4985c927936c0b7af96ee
parent8d1a1cb1b816381bf60cb1211c93b8eba1fe1472
sra: Avoid totally scalarizing overallping field_decls (PR 93667)

[[no_unique_address]] C++ attribute can cause two fields of a
RECORD_TYPE overlap, which currently confuses the totally scalarizing
code into creating invalid access tree.  For GCC 10, I'd like to
simply disable total scalarization of types where this happens.

For GCC 11 I'll write down a TODO item to enable total scalarization
of cases like this where the problematic fields are basically empty -
despite having a non-zero size - i.e. when they are just RECORD_TYPEs
without any data fields.

2020-02-19  Martin Jambor  <mjambor@suse.cz>

gcc/

PR tree-optimization/93667
* tree-sra.c (scalarizable_type_p): Return false if record fields
do not follow wach other.

gcc/testsuite/

PR tree-optimization/93667
* g++.dg/tree-ssa/pr93667.C: New test.
gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr93667.C [new file with mode: 0644]
gcc/tree-sra.c