re PR tree-optimization/23911 (Failure to propagate constants from a const initializer for _Complex)

gcc/
	PR tree-optimization/23911
	* tree-ssa-ccp.c (fold_const_aggregate_ref): Handle REALPART_EXPR
	and IMAGPART_EXPR too.

testsuite/
	* gcc.dg/pr23911.c: New test.

From-SVN: r104771
This commit is contained in:
Steven Bosscher 2005-09-29 12:25:10 +00:00 committed by Steven Bosscher
parent 577b2a064e
commit 1ebd8d9ac1
4 changed files with 41 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2005-09-29 Steven Bosscher <stevenb@suse.de>
PR tree-optimization/23911
* tree-ssa-ccp.c (fold_const_aggregate_ref): Handle REALPART_EXPR
and IMAGPART_EXPR too.
2005-09-28 Mark Mitchell <mark@codesourcery.com>
PR 17886

View File

@ -1,3 +1,7 @@
2005-09-29 Steven Bosscher <stevenb@suse.de>
* gcc.dg/pr23911.c: New test.
2005-09-28 Mark Mitchell <mark@codesourcery.com>
* g++.dg/opt/pr19650.C: Use -w -fpermissive.

View File

@ -0,0 +1,22 @@
/* This was a missed optimization in tree constant propagation
that CSE would catch later on. */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-store_ccp" } */
double _Complex *a;
const double _Complex b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
void
test (void)
{
a[0] = b[0] + b[1];
a[1] = b[0] + b[1];
return;
}
/* After store_ccp, there should not be any assignments from real or
imaginary parts anymore. The constants should be loaded from b and
propagated into the elements of a. */
/* { dg-final { scan-tree-dump-times "= CR" 0 "store_ccp" } } */
/* { dg-final { scan-tree-dump-times "= CI" 0 "store_ccp" } } */
/* { dg-final { cleanup-tree-dump "store_ccp" } } */

View File

@ -1045,6 +1045,15 @@ fold_const_aggregate_ref (tree t)
return cval;
break;
case REALPART_EXPR:
case IMAGPART_EXPR:
{
tree c = fold_const_aggregate_ref (TREE_OPERAND (t, 0));
if (c && TREE_CODE (c) == COMPLEX_CST)
return fold_build1 (TREE_CODE (t), TREE_TYPE (t), c);
break;
}
default:
break;
}