re PR tree-optimization/32810 (Not folding of const element for goto)

2008-03-27  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/32810
	* tree-ssa-ccp.c (get_symbol_constant_value): Strip useless
	conversions from DECL_INITIAL.
	(fold_const_aggregate_ref): Likewise from constructor elements.

	* gcc.dg/tree-ssa/ssa-ccp-18.c: New testcase.

From-SVN: r133645
This commit is contained in:
Richard Guenther 2008-03-27 16:32:28 +00:00 committed by Richard Biener
parent 525521b6dd
commit 62bc00e258
4 changed files with 46 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2008-03-27 Richard Guenther <rguenther@suse.de>
PR tree-optimization/32810
* tree-ssa-ccp.c (get_symbol_constant_value): Strip useless
conversions from DECL_INITIAL.
(fold_const_aggregate_ref): Likewise from constructor elements.
2008-03-27 Zdenek Dvorak <ook@ucw.cz> 2008-03-27 Zdenek Dvorak <ook@ucw.cz>
* tree-affine.h (aff_combination_expand): Declare. * tree-affine.h (aff_combination_expand): Declare.

View File

@ -1,3 +1,8 @@
2008-03-27 Richard Guenther <rguenther@suse.de>
PR tree-optimization/32810
* gcc.dg/tree-ssa/ssa-ccp-18.c: New testcase.
2008-03-27 Douglas Gregor <doug.gregor@gmail.com> 2008-03-27 Douglas Gregor <doug.gregor@gmail.com>
* g++.dg/cpp0x/variadic91.C: New. * g++.dg/cpp0x/variadic91.C: New.

View File

@ -0,0 +1,20 @@
/* { dg-do compile } */
/* { dg-options "-O -fdump-tree-ccp1" } */
/* Check that we constant propagate &&c into the goto and remove
the unreachable BBs. */
void a(int*); void b(int*); void c(int*); void d(int*);
void func2(int* val)
{
const void *const labels[] = { &&a, &&b, &&c, &&d };
goto *labels[2];
a: a(val);
b: b(val);
c: c(val);
d: d(val);
}
/* { dg-final { scan-tree-dump-not "a \\\(" "ccp1" } } */
/* { dg-final { scan-tree-dump-not "b \\\(" "ccp1" } } */
/* { dg-final { cleanup-tree-dump "ccp1" } } */

View File

@ -278,9 +278,12 @@ get_symbol_constant_value (tree sym)
&& !MTAG_P (sym)) && !MTAG_P (sym))
{ {
tree val = DECL_INITIAL (sym); tree val = DECL_INITIAL (sym);
if (val if (val)
&& is_gimple_min_invariant (val)) {
return val; STRIP_USELESS_TYPE_CONVERSION (val);
if (is_gimple_min_invariant (val))
return val;
}
/* Variables declared 'const' without an initializer /* Variables declared 'const' without an initializer
have zero as the intializer if they may not be have zero as the intializer if they may not be
overridden at link or run time. */ overridden at link or run time. */
@ -1104,7 +1107,10 @@ fold_const_aggregate_ref (tree t)
/* Whoo-hoo! I'll fold ya baby. Yeah! */ /* Whoo-hoo! I'll fold ya baby. Yeah! */
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval) FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
if (tree_int_cst_equal (cfield, idx)) if (tree_int_cst_equal (cfield, idx))
return cval; {
STRIP_USELESS_TYPE_CONVERSION (cval);
return cval;
}
break; break;
case COMPONENT_REF: case COMPONENT_REF:
@ -1144,7 +1150,10 @@ fold_const_aggregate_ref (tree t)
if (cfield == field if (cfield == field
/* FIXME: Handle bit-fields. */ /* FIXME: Handle bit-fields. */
&& ! DECL_BIT_FIELD (cfield)) && ! DECL_BIT_FIELD (cfield))
return cval; {
STRIP_USELESS_TYPE_CONVERSION (cval);
return cval;
}
break; break;
case REALPART_EXPR: case REALPART_EXPR: