Commit 62bc00e2 by Richard Guenther Committed by Richard Biener

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
parent 525521b6
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.
......
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.
/* { 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" } } */
...@@ -278,9 +278,12 @@ get_symbol_constant_value (tree sym) ...@@ -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) ...@@ -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) ...@@ -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:
......
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