diff options
author | Jan Hubicka <jh@suse.cz> | 2010-09-04 19:36:49 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2010-09-04 17:36:49 +0000 |
commit | 17f39a395648213a0c6014e84ff34f3ff565a10b (patch) | |
tree | 57771775ce3d663de352f64104a3e0370a61a56f /gcc/tree-ssa-ccp.c | |
parent | 5f7ae6b656d4468b1f2ebf3f773e494c7d147624 (diff) | |
download | gcc-17f39a395648213a0c6014e84ff34f3ff565a10b.zip gcc-17f39a395648213a0c6014e84ff34f3ff565a10b.tar.gz gcc-17f39a395648213a0c6014e84ff34f3ff565a10b.tar.bz2 |
foldconst-2.c: New testcase.
* 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.
From-SVN: r163861
Diffstat (limited to 'gcc/tree-ssa-ccp.c')
-rw-r--r-- | gcc/tree-ssa-ccp.c | 34 |
1 files changed, 7 insertions, 27 deletions
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 8c42a63..32fde45 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)) |