Relocate range_cast to header, and add a generic version.
Make range_cast inlinable by moving it to the header file. Also trap if the destination is not capable of representing the cast type. Add a generic version which can change range classes.. ie float to int. * range-op.cc (range_cast): Move to... * range-op.h (range_cast): Here and add generic a version.
This commit is contained in:
parent
953bbeaeff
commit
c570818b43
2 changed files with 43 additions and 19 deletions
|
@ -4929,24 +4929,6 @@ pointer_table::pointer_table ()
|
|||
set (BIT_XOR_EXPR, op_bitwise_xor);
|
||||
}
|
||||
|
||||
// Cast the range in R to TYPE.
|
||||
|
||||
bool
|
||||
range_cast (vrange &r, tree type)
|
||||
{
|
||||
Value_Range tmp (r);
|
||||
Value_Range varying (type);
|
||||
varying.set_varying (type);
|
||||
range_op_handler op (CONVERT_EXPR, type);
|
||||
// Call op_convert, if it fails, the result is varying.
|
||||
if (!op || !op.fold_range (r, type, tmp, varying))
|
||||
{
|
||||
r.set_varying (type);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#if CHECKING_P
|
||||
#include "selftest.h"
|
||||
|
||||
|
|
|
@ -216,7 +216,49 @@ protected:
|
|||
range_operator *m_operator;
|
||||
};
|
||||
|
||||
extern bool range_cast (vrange &, tree type);
|
||||
// Cast the range in R to TYPE if R supports TYPE.
|
||||
|
||||
inline bool
|
||||
range_cast (vrange &r, tree type)
|
||||
{
|
||||
gcc_checking_assert (r.supports_type_p (type));
|
||||
Value_Range tmp (r);
|
||||
Value_Range varying (type);
|
||||
varying.set_varying (type);
|
||||
range_op_handler op (CONVERT_EXPR, type);
|
||||
// Call op_convert, if it fails, the result is varying.
|
||||
if (!op || !op.fold_range (r, type, tmp, varying))
|
||||
{
|
||||
r.set_varying (type);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Range cast which is capable of switching range kinds.
|
||||
// ie for float to int.
|
||||
|
||||
inline bool
|
||||
range_cast (Value_Range &r, tree type)
|
||||
{
|
||||
Value_Range tmp (r);
|
||||
Value_Range varying (type);
|
||||
varying.set_varying (type);
|
||||
|
||||
// Ensure we are in the correct mode for the call to fold.
|
||||
r.set_type (type);
|
||||
|
||||
range_op_handler op (CONVERT_EXPR, type);
|
||||
// Call op_convert, if it fails, the result is varying.
|
||||
if (!op || !op.fold_range (r, type, tmp, varying))
|
||||
{
|
||||
r.set_varying (type);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
extern void wi_set_zero_nonzero_bits (tree type,
|
||||
const wide_int &, const wide_int &,
|
||||
wide_int &maybe_nonzero,
|
||||
|
|
Loading…
Add table
Reference in a new issue