Commit 665c5bad by Martin Jambor

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.
parent 8d1a1cb1
2020-02-19 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/93667
* tree-sra.c (scalarizable_type_p): Return false if record fields
do not follow wach other.
2020-01-21 Kito Cheng <kito.cheng@sifive.com> 2020-01-21 Kito Cheng <kito.cheng@sifive.com>
* config/riscv/riscv.c (riscv_output_move) Using fmv.x.w/fmv.w.x * config/riscv/riscv.c (riscv_output_move) Using fmv.x.w/fmv.w.x
......
2020-02-19 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/93667
* g++.dg/tree-ssa/pr93667.C: New test.
2020-02-19 Hongtao Liu <hongtao.liu@intel.com> 2020-02-19 Hongtao Liu <hongtao.liu@intel.com>
* g++.dg/other/i386-2.C: add -mavx512vbmi2 * g++.dg/other/i386-2.C: add -mavx512vbmi2
......
// { dg-do compile }
// { dg-options "-O2 -std=c++2a" } */
struct a {};
struct b { [[no_unique_address]] a aq; };
struct c {
int d;
[[no_unique_address]] b e;
};
c f() {return {};}
void g() { f(); }
...@@ -958,6 +958,9 @@ scalarizable_type_p (tree type, bool const_decl) ...@@ -958,6 +958,9 @@ scalarizable_type_p (tree type, bool const_decl)
if (type_contains_placeholder_p (type)) if (type_contains_placeholder_p (type))
return false; return false;
bool have_predecessor_field = false;
HOST_WIDE_INT prev_pos = 0;
switch (TREE_CODE (type)) switch (TREE_CODE (type))
{ {
case RECORD_TYPE: case RECORD_TYPE:
...@@ -966,6 +969,17 @@ scalarizable_type_p (tree type, bool const_decl) ...@@ -966,6 +969,17 @@ scalarizable_type_p (tree type, bool const_decl)
{ {
tree ft = TREE_TYPE (fld); tree ft = TREE_TYPE (fld);
if (zerop (DECL_SIZE (fld)))
continue;
HOST_WIDE_INT pos = int_bit_position (fld);
if (have_predecessor_field
&& pos <= prev_pos)
return false;
have_predecessor_field = true;
prev_pos = pos;
if (DECL_BIT_FIELD (fld)) if (DECL_BIT_FIELD (fld))
return false; return false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment