From: Jan Hubicka Date: Tue, 7 Sep 2010 15:50:22 +0000 (+0200) Subject: tree-ssa-ccp.c (fold_const_aggregate_ref): Fix handling of array_ref_low_bound in... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9c4ce18d030434d47e6ad6b68caa4f630bc6df72;p=gcc.git tree-ssa-ccp.c (fold_const_aggregate_ref): Fix handling of array_ref_low_bound in string access folding. * tree-ssa-ccp.c (fold_const_aggregate_ref): Fix handling of array_ref_low_bound in string access folding. From-SVN: r163956 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 97f24154b5d..7d75459163e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-09-07 Jan Hubicka + + * tree-ssa-ccp.c (fold_const_aggregate_ref): Fix handling of array_ref_low_bound + in string access folding. + 2010-09-07 Uros Bizjak PR target/45206 @@ -6,7 +11,7 @@ 2010-09-07 Jan Hubicka - * gimple.c (maybe_fold_reference): Verify that operand is + * gimple-fold.c (maybe_fold_reference): Verify that operand is gimple_min_invariant. 2010-09-07 Richard Guenther diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index fc3f1586b16..734147794a6 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -1398,17 +1398,30 @@ fold_const_aggregate_ref (tree t) } /* Fold read from constant string. */ - if (TREE_CODE (ctor) == STRING_CST) + if (TREE_CODE (ctor) == STRING_CST + && TREE_CODE (idx) == INTEGER_CST) { + tree low_bound = array_ref_low_bound (t); + double_int low_bound_cst; + double_int index_cst; + double_int length_cst; + bool signed_p = TYPE_UNSIGNED (TREE_TYPE (idx)); + + if (TREE_CODE (low_bound) != INTEGER_CST) + return NULL_TREE; + low_bound_cst = tree_to_double_int (low_bound); + index_cst = tree_to_double_int (idx); + length_cst = uhwi_to_double_int (TREE_STRING_LENGTH (ctor)); + index_cst = double_int_sub (index_cst, low_bound_cst); if ((TYPE_MODE (TREE_TYPE (t)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == MODE_INT) && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1 - && compare_tree_int (idx, TREE_STRING_LENGTH (ctor)) < 0) + && double_int_cmp (index_cst, length_cst, signed_p) < 0) return build_int_cst_type (TREE_TYPE (t), (TREE_STRING_POINTER (ctor) - [TREE_INT_CST_LOW (idx)])); + [double_int_to_uhwi (index_cst)])); return NULL_TREE; }