summaryrefslogtreecommitdiff
path: root/gcc/tree-ssanames.c
diff options
context:
space:
mode:
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-28 16:15:52 +0000
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-28 16:15:52 +0000
commitc6a711c35b88fbed90b943a038e320e90f31eb35 (patch)
tree217f4d30b00b58d646c8c06c615dd102545bacf3 /gcc/tree-ssanames.c
parent1f88bc7951b32a6576a9219fa5676a29dcead06a (diff)
downloadgcc-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.c47
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;