summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-ccp.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2010-09-04 17:36:49 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2010-09-04 17:36:49 +0000
commit15ba153a5dfb70920183581d3c66d85aa53cbdaa (patch)
tree57771775ce3d663de352f64104a3e0370a61a56f /gcc/tree-ssa-ccp.c
parente579afdd943e828b6c17afe76c465bf4c72f0d93 (diff)
downloadgcc-15ba153a5dfb70920183581d3c66d85aa53cbdaa.tar.gz
* gcc.dg/tree-ssa/foldconst-2.c: New testcase.
* gcc.dg/tree-ssa/foldconst-3.c: New testcase. * gimple-fold.c (maybe_fold_reference): Use fold_const_aggregate_ref. * tree-ssa-ccp.c (fold_const_aggregate_ref): Use fold_read_from_constant_string. * gimple.h (canonicalize_constructor_val): Declare. * gimple-fold.c (canonicalize_constructor_val): New function. (get_symbol_constant_value):Use it. * tree-ssa-ccp.c (fold_const_aggregate_ref): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163861 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-ccp.c')
-rw-r--r--gcc/tree-ssa-ccp.c34
1 files changed, 7 insertions, 27 deletions
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
index 8c42a633665..32fde458f13 100644
--- a/gcc/tree-ssa-ccp.c
+++ b/gcc/tree-ssa-ccp.c
@@ -1325,6 +1325,10 @@ fold_const_aggregate_ref (tree t)
if (TREE_CODE_CLASS (TREE_CODE (t)) == tcc_declaration)
return get_symbol_constant_value (t);
+ tem = fold_read_from_constant_string (t);
+ if (tem)
+ return tem;
+
switch (TREE_CODE (t))
{
case ARRAY_REF:
@@ -1413,16 +1417,7 @@ fold_const_aggregate_ref (tree t)
/* Whoo-hoo! I'll fold ya baby. Yeah! */
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
if (tree_int_cst_equal (cfield, idx))
- {
- STRIP_NOPS (cval);
- if (TREE_CODE (cval) == ADDR_EXPR)
- {
- tree base = get_base_address (TREE_OPERAND (cval, 0));
- if (base && TREE_CODE (base) == VAR_DECL)
- add_referenced_var (base);
- }
- return cval;
- }
+ return canonicalize_constructor_val (cval);
break;
case COMPONENT_REF:
@@ -1463,16 +1458,7 @@ fold_const_aggregate_ref (tree t)
if (cfield == field
/* FIXME: Handle bit-fields. */
&& ! DECL_BIT_FIELD (cfield))
- {
- STRIP_NOPS (cval);
- if (TREE_CODE (cval) == ADDR_EXPR)
- {
- tree base = get_base_address (TREE_OPERAND (cval, 0));
- if (base && TREE_CODE (base) == VAR_DECL)
- add_referenced_var (base);
- }
- return cval;
- }
+ return canonicalize_constructor_val (cval);
break;
case REALPART_EXPR:
@@ -1567,13 +1553,7 @@ fold_const_aggregate_ref (tree t)
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
if (tree_int_cst_equal (cfield, idx))
{
- STRIP_NOPS (cval);
- if (TREE_CODE (cval) == ADDR_EXPR)
- {
- tree base = get_base_address (TREE_OPERAND (cval, 0));
- if (base && TREE_CODE (base) == VAR_DECL)
- add_referenced_var (base);
- }
+ cval = canonicalize_constructor_val (cval);
if (useless_type_conversion_p (TREE_TYPE (t), TREE_TYPE (cval)))
return cval;
else if (CONSTANT_CLASS_P (cval))