[COMMITTED] Tweaks to global ranges.
Commit Message
The global get_nonzero_bits was previously returning -1 for
unsupported types. I dropped this in the conversion to global ranges
and it's causing a problem in the frange work, where CCP is asking for
the nonzero bits of non-integral types. CCP may require further
tweaks, but for now, restore the original behavior.
Also, I'm removing old checks for precision that no longer hold, now
that we handle various types for global ranges.
Tested on x86-64 Linux.
gcc/ChangeLog:
* tree-ssanames.cc (get_nonzero_bits): Return -1 for unsupported
types.
* value-query.cc (get_ssa_name_range_info): Remove precision check.
---
gcc/tree-ssanames.cc | 3 +--
gcc/value-query.cc | 9 +++------
2 files changed, 4 insertions(+), 8 deletions(-)
@@ -489,13 +489,12 @@ get_nonzero_bits (const_tree name)
return wi::shwi (-1, precision);
}
- if (!range_info_p (name))
+ if (!range_info_p (name) || !irange::supports_p (TREE_TYPE (name)))
return wi::shwi (-1, precision);
/* Optimization to get at the nonzero bits because we know the
storage type. This saves us measurable time compared to going
through vrange_storage. */
- gcc_checking_assert (irange::supports_p (TREE_TYPE (name)));
irange_storage_slot *ri
= static_cast <irange_storage_slot *> (SSA_NAME_RANGE_INFO (name));
return ri->get_nonzero_bits ();
@@ -280,16 +280,13 @@ get_ssa_name_range_info (vrange &r, const_tree name)
void *ri = SSA_NAME_RANGE_INFO (name);
- // Return VR_VARYING for SSA_NAMEs with NULL RANGE_INFO or SSA_NAMEs
- // with integral types width > 2 * HOST_BITS_PER_WIDE_INT precision.
- if (!ri || (GET_MODE_PRECISION (SCALAR_INT_TYPE_MODE (TREE_TYPE (name)))
- > 2 * HOST_BITS_PER_WIDE_INT))
- r.set_varying (type);
- else
+ if (ri)
{
vrange_storage vstore (NULL);
vstore.get_vrange (ri, r, TREE_TYPE (name));
}
+ else
+ r.set_varying (type);
}
// Return nonnull attribute of pointer NAME from SSA_NAME_PTR_INFO.