diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-28 16:15:52 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-28 16:15:52 +0000 |
commit | c6a711c35b88fbed90b943a038e320e90f31eb35 (patch) | |
tree | 217f4d30b00b58d646c8c06c615dd102545bacf3 /gcc/tree-ssanames.c | |
parent | 1f88bc7951b32a6576a9219fa5676a29dcead06a (diff) | |
download | gcc-c6a711c35b88fbed90b943a038e320e90f31eb35.tar.gz |
gcc/
* tree-core.h (tree_base): Document use of static_flag for SSA_NAME.
* tree.h (SSA_NAME_ANTI_RANGE_P, SSA_NAME_RANGE_TYPE): New macros.
* tree-ssanames.h (set_range_info): Add range_type argument.
(duplicate_ssa_name_range_info): Likewise.
* tree-ssanames.c (set_range_info): Take the range type as argument
and store it in SSA_NAME_ANTI_RANGE_P.
(duplicate_ssa_name_range_info): Likewise.
(get_range_info): Use SSA_NAME_ANTI_RANGE_P.
(set_nonzero_bits): Update call to set_range_info.
(duplicate_ssa_name_fn): Update call to duplicate_ssa_name_range_info.
* tree-ssa-copy.c (fini_copy_prop): Likewise.
* tree-vrp.c (remove_range_assertions): Update call to set_range_info.
(vrp_finalize): Likewise, passing anti-ranges directly.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205489 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssanames.c')
-rw-r--r-- | gcc/tree-ssanames.c | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c index 4e1732dd8b3..ff7639bd149 100644 --- a/gcc/tree-ssanames.c +++ b/gcc/tree-ssanames.c @@ -183,12 +183,14 @@ make_ssa_name_fn (struct function *fn, tree var, gimple stmt) return t; } -/* Store range information MIN, and MAX to tree ssa_name NAME. */ +/* Store range information RANGE_TYPE, MIN, and MAX to tree ssa_name NAME. */ void -set_range_info (tree name, double_int min, double_int max) +set_range_info (tree name, enum value_range_type range_type, double_int min, + double_int max) { gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name))); + gcc_assert (range_type == VR_RANGE || range_type == VR_ANTI_RANGE); range_info_def *ri = SSA_NAME_RANGE_INFO (name); /* Allocate if not available. */ @@ -199,12 +201,16 @@ set_range_info (tree name, double_int min, double_int max) ri->nonzero_bits = double_int::mask (TYPE_PRECISION (TREE_TYPE (name))); } + /* Record the range type. */ + if (SSA_NAME_RANGE_TYPE (name) != range_type) + SSA_NAME_ANTI_RANGE_P (name) = (range_type == VR_ANTI_RANGE); + /* Set the values. */ ri->min = min; ri->max = max; /* If it is a range, try to improve nonzero_bits from the min/max. */ - if (min.cmp (max, TYPE_UNSIGNED (TREE_TYPE (name))) != 1) + if (range_type == VR_RANGE) { int prec = TYPE_PRECISION (TREE_TYPE (name)); double_int xorv; @@ -230,7 +236,6 @@ set_range_info (tree name, double_int min, double_int max) enum value_range_type get_range_info (const_tree name, double_int *min, double_int *max) { - enum value_range_type range_type; gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name))); gcc_assert (min && max); range_info_def *ri = SSA_NAME_RANGE_INFO (name); @@ -241,22 +246,9 @@ get_range_info (const_tree name, double_int *min, double_int *max) > 2 * HOST_BITS_PER_WIDE_INT)) return VR_VARYING; - /* If min > max, it is VR_ANTI_RANGE. */ - if (ri->min.cmp (ri->max, TYPE_UNSIGNED (TREE_TYPE (name))) == 1) - { - /* VR_ANTI_RANGE ~[min, max] is encoded as [max + 1, min - 1]. */ - range_type = VR_ANTI_RANGE; - *min = ri->max + double_int_one; - *max = ri->min - double_int_one; - } - else - { - /* Otherwise (when min <= max), it is VR_RANGE. */ - range_type = VR_RANGE; - *min = ri->min; - *max = ri->max; - } - return range_type; + *min = ri->min; + *max = ri->max; + return SSA_NAME_RANGE_TYPE (name); } /* Change non-zero bits bitmask of NAME. */ @@ -266,7 +258,7 @@ set_nonzero_bits (tree name, double_int mask) { gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name))); if (SSA_NAME_RANGE_INFO (name) == NULL) - set_range_info (name, + set_range_info (name, VR_RANGE, tree_to_double_int (TYPE_MIN_VALUE (TREE_TYPE (name))), tree_to_double_int (TYPE_MAX_VALUE (TREE_TYPE (name)))); range_info_def *ri = SSA_NAME_RANGE_INFO (name); @@ -495,15 +487,17 @@ duplicate_ssa_name_ptr_info (tree name, struct ptr_info_def *ptr_info) SSA_NAME_PTR_INFO (name) = new_ptr_info; } -/* Creates a duplicate of the range_info_def at RANGE_INFO for use by - the SSA name NAME. */ +/* Creates a duplicate of the range_info_def at RANGE_INFO of type + RANGE_TYPE for use by the SSA name NAME. */ void -duplicate_ssa_name_range_info (tree name, struct range_info_def *range_info) +duplicate_ssa_name_range_info (tree name, enum value_range_type range_type, + struct range_info_def *range_info) { struct range_info_def *new_range_info; gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name))); gcc_assert (!SSA_NAME_RANGE_INFO (name)); + gcc_assert (!SSA_NAME_ANTI_RANGE_P (name)); if (!range_info) return; @@ -511,6 +505,8 @@ duplicate_ssa_name_range_info (tree name, struct range_info_def *range_info) new_range_info = ggc_alloc_range_info_def (); *new_range_info = *range_info; + gcc_assert (range_type == VR_RANGE || range_type == VR_ANTI_RANGE); + SSA_NAME_ANTI_RANGE_P (name) = (range_type == VR_ANTI_RANGE); SSA_NAME_RANGE_INFO (name) = new_range_info; } @@ -535,7 +531,8 @@ duplicate_ssa_name_fn (struct function *fn, tree name, gimple stmt) struct range_info_def *old_range_info = SSA_NAME_RANGE_INFO (name); if (old_range_info) - duplicate_ssa_name_range_info (new_name, old_range_info); + duplicate_ssa_name_range_info (new_name, SSA_NAME_RANGE_TYPE (name), + old_range_info); } return new_name; |