middle-end/100509 - avoid folding constant to aggregate type

When folding a constant initializer looking through aliases to
incompatible types can lead to us trying to fold a constant
to an aggregate type which can't work.  Simply avoid trying
to constant fold non-register typed symbols.

2021-05-11  Richard Biener  <rguenther@suse.de>

	PR middle-end/100509
	* gimple-fold.c (fold_gimple_assign): Only call
	get_symbol_constant_value on register type symbols.

	* gcc.dg/pr100509.c: New testcase.
This commit is contained in:
Richard Biener 2021-05-11 10:58:35 +02:00
parent 9b905ba9eb
commit ca8e830118
2 changed files with 11 additions and 1 deletions

View File

@ -547,7 +547,8 @@ fold_gimple_assign (gimple_stmt_iterator *si)
CONSTRUCTOR_ELTS (rhs));
}
else if (DECL_P (rhs))
else if (DECL_P (rhs)
&& is_gimple_reg_type (TREE_TYPE (rhs)))
return get_symbol_constant_value (rhs);
}
break;

View File

@ -0,0 +1,9 @@
/* { dg-do compile } */
/* { dg-options "-O" } */
struct X {
int a;
};
const int a = 0;
static struct X A __attribute__((alias("a")));
void foo() { struct X b = A; }