frange: Make the setter taking trees a wrapper.
The frange setter does all its work in trees. This incurs a penalty for the real_value variants because they must wrap their arguments into a tree and pass it to the tree setter, which will then do the opposite. This is leftovers from the irange setter. Even though the we still need constructors taking trees so we can interact with the tree world, there's no sense penalizing the rest of the implementation. Tested on x86-64 Linux. gcc/ChangeLog: * value-range.cc (frange::set): Swap setters such that the one accepting REAL_VALUE_TYPE does all the work.
This commit is contained in:
parent
4ceb5bc42d
commit
ab0f70a630
1 changed files with 14 additions and 17 deletions
|
@ -290,7 +290,9 @@ frange::flush_denormals_to_zero ()
|
|||
// Setter for franges.
|
||||
|
||||
void
|
||||
frange::set (tree min, tree max, value_range_kind kind)
|
||||
frange::set (tree type,
|
||||
const REAL_VALUE_TYPE &min, const REAL_VALUE_TYPE &max,
|
||||
value_range_kind kind)
|
||||
{
|
||||
switch (kind)
|
||||
{
|
||||
|
@ -299,7 +301,7 @@ frange::set (tree min, tree max, value_range_kind kind)
|
|||
return;
|
||||
case VR_VARYING:
|
||||
case VR_ANTI_RANGE:
|
||||
set_varying (TREE_TYPE (min));
|
||||
set_varying (type);
|
||||
return;
|
||||
case VR_RANGE:
|
||||
break;
|
||||
|
@ -308,14 +310,12 @@ frange::set (tree min, tree max, value_range_kind kind)
|
|||
}
|
||||
|
||||
// Handle NANs.
|
||||
if (real_isnan (TREE_REAL_CST_PTR (min)) || real_isnan (TREE_REAL_CST_PTR (max)))
|
||||
if (real_isnan (&min) || real_isnan (&max))
|
||||
{
|
||||
gcc_checking_assert (real_identical (TREE_REAL_CST_PTR (min),
|
||||
TREE_REAL_CST_PTR (max)));
|
||||
tree type = TREE_TYPE (min);
|
||||
gcc_checking_assert (real_identical (&min, &max));
|
||||
if (HONOR_NANS (type))
|
||||
{
|
||||
bool sign = real_isneg (TREE_REAL_CST_PTR (min));
|
||||
bool sign = real_isneg (&min);
|
||||
set_nan (type, sign);
|
||||
}
|
||||
else
|
||||
|
@ -324,9 +324,9 @@ frange::set (tree min, tree max, value_range_kind kind)
|
|||
}
|
||||
|
||||
m_kind = kind;
|
||||
m_type = TREE_TYPE (min);
|
||||
m_min = *TREE_REAL_CST_PTR (min);
|
||||
m_max = *TREE_REAL_CST_PTR (max);
|
||||
m_type = type;
|
||||
m_min = min;
|
||||
m_max = max;
|
||||
if (HONOR_NANS (m_type))
|
||||
{
|
||||
m_pos_nan = true;
|
||||
|
@ -351,7 +351,7 @@ frange::set (tree min, tree max, value_range_kind kind)
|
|||
}
|
||||
|
||||
// Check for swapped ranges.
|
||||
gcc_checking_assert (tree_compare (LE_EXPR, min, max));
|
||||
gcc_checking_assert (real_compare (LE_EXPR, &min, &max));
|
||||
|
||||
normalize_kind ();
|
||||
|
||||
|
@ -361,14 +361,11 @@ frange::set (tree min, tree max, value_range_kind kind)
|
|||
verify_range ();
|
||||
}
|
||||
|
||||
// Setter for frange from REAL_VALUE_TYPE endpoints.
|
||||
|
||||
void
|
||||
frange::set (tree type,
|
||||
const REAL_VALUE_TYPE &min, const REAL_VALUE_TYPE &max,
|
||||
value_range_kind kind)
|
||||
frange::set (tree min, tree max, value_range_kind kind)
|
||||
{
|
||||
set (build_real (type, min), build_real (type, max), kind);
|
||||
set (TREE_TYPE (min),
|
||||
*TREE_REAL_CST_PTR (min), *TREE_REAL_CST_PTR (max), kind);
|
||||
}
|
||||
|
||||
// Normalize range to VARYING or UNDEFINED, or vice versa. Return
|
||||
|
|
Loading…
Add table
Reference in a new issue