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:
Andrew MacLeod 2023-05-31 17:02:00 -04:00
parent 953bbeaeff
commit c570818b43
2 changed files with 43 additions and 19 deletions

View file

@ -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"

View file

@ -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,