aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2006-07-03 20:14:18 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2006-07-03 20:14:18 +0000
commit11fc42759850498a535a03418e667a57461fab91 (patch)
tree730ad49fb04e92cd040cc6234ab11f52bd71851f /gcc/tree.c
parent2da7ea252a6b95314132dea56d806501a3303f77 (diff)
downloadgcc-11fc42759850498a535a03418e667a57461fab91.zip
gcc-11fc42759850498a535a03418e667a57461fab91.tar.gz
gcc-11fc42759850498a535a03418e667a57461fab91.tar.bz2
tree.c (range_in_array_bounds_p): New predicate.
* tree.c (range_in_array_bounds_p): New predicate. * tree.h (range_in_array_bounds_p): Declare it. * tree-eh.c (tree_could_trap_p) <ARRAY_RANGE_REF>: Use it to return a less conservative answer. * tree-sra.c (struct sra_elt): Add new pointer field 'groups' and flag 'is_group'. (IS_ELEMENT_FOR_GROUP): New macro. (FOR_EACH_ACTUAL_CHILD): Likewise. (next_child_for_group): New helper function. (can_completely_scalarize_p): Take into account groups. (sra_hash_tree): Handle RANGE_EXPR. (sra_elt_eq): Likewise. (lookup_element): Be prepared for handling groups. (is_valid_const_index): Delete. (maybe_lookup_element_for_expr) <ARRAY_REF>: Use in_array_bounds_p instead of is_valid_const_index. <ARRAY_RANGE_REF>: New case. (sra_walk_expr) <ARRAY_REF>: Use in_array_bounds_p instead of is_valid_const_index. <ARRAY_RANGE_REF>: Do not unconditionally punt. (scan_dump): Dump info for groups too. (decide_instantiation_1): Likewise. (decide_block_copy): Assert that the element is not a group. Propagate decision to groups. (generate_one_element_ref): Handle RANGE_EXPR. (mark_no_warning): Iterate over actual childs. (generate_copy_inout): Likewise. (generate_element_copy): Likewise. (generate_element_zero): Likewise. (generate_element_init_1): Likewise. (dump_sra_elt_name): Handle RANGE_EXPR. From-SVN: r115160
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 15171e3..f3889e2 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -6892,6 +6892,39 @@ in_array_bounds_p (tree ref)
return true;
}
+/* Returns true if it is possible to prove that the range of
+ an array access REF (an ARRAY_RANGE_REF expression) falls
+ into the array bounds. */
+
+bool
+range_in_array_bounds_p (tree ref)
+{
+ tree domain_type = TYPE_DOMAIN (TREE_TYPE (ref));
+ tree range_min, range_max, min, max;
+
+ range_min = TYPE_MIN_VALUE (domain_type);
+ range_max = TYPE_MAX_VALUE (domain_type);
+ if (!range_min
+ || !range_max
+ || TREE_CODE (range_min) != INTEGER_CST
+ || TREE_CODE (range_max) != INTEGER_CST)
+ return false;
+
+ min = array_ref_low_bound (ref);
+ max = array_ref_up_bound (ref);
+ if (!min
+ || !max
+ || TREE_CODE (min) != INTEGER_CST
+ || TREE_CODE (max) != INTEGER_CST)
+ return false;
+
+ if (tree_int_cst_lt (range_min, min)
+ || tree_int_cst_lt (max, range_max))
+ return false;
+
+ return true;
+}
+
/* Return true if T (assumed to be a DECL) is a global variable. */
bool