GCC Middle and Back End API Reference
|
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "backend.h"
#include "insn-codes.h"
#include "rtl.h"
#include "tree.h"
#include "gimple.h"
#include "cfghooks.h"
#include "tree-pass.h"
#include "ssa.h"
#include "optabs-tree.h"
#include "gimple-pretty-print.h"
#include "diagnostic-core.h"
#include "flags.h"
#include "fold-const.h"
#include "stor-layout.h"
#include "calls.h"
#include "cfganal.h"
#include "gimple-iterator.h"
#include "gimple-fold.h"
#include "tree-eh.h"
#include "gimple-walk.h"
#include "tree-cfg.h"
#include "wide-int.h"
#include "value-relation.h"
#include "range-op.h"
#include "range-op-mixed.h"
Data Structures | |
class | foperator_unordered |
class | foperator_ordered |
class | foperator_unordered_lt |
class | foperator_unordered_le |
class | foperator_unordered_gt |
class | foperator_unordered_ge |
class | foperator_unordered_equal |
class | foperator_ltgt |
class | foperator_div |
References frange_add_zeros(), frange_val_max(), gcc_checking_assert, frange::known_isnan(), frange::lower_bound(), r, and REAL_VALUE_TYPE.
Referenced by foperator_unordered_ge::op1_range(), foperator_unordered_lt::op1_range(), operator_ge::op1_range(), operator_ge::op1_range(), operator_ge::op1_range(), operator_lt::op1_range(), operator_lt::op1_range(), operator_lt::op1_range(), foperator_unordered_gt::op2_range(), foperator_unordered_le::op2_range(), operator_gt::op2_range(), operator_gt::op2_range(), operator_gt::op2_range(), operator_le::op2_range(), operator_le::op2_range(), and operator_le::op2_range().
References frange_nextafter(), frange_val_max(), gcc_checking_assert, HONOR_NANS(), frange::known_isnan(), frange::lower_bound(), MODE_COMPOSITE_P, r, real_isinf(), REAL_VALUE_TYPE, and TYPE_MODE.
Referenced by foperator_unordered_gt::op1_range(), foperator_unordered_le::op1_range(), operator_gt::op1_range(), operator_gt::op1_range(), operator_gt::op1_range(), operator_le::op1_range(), operator_le::op1_range(), operator_le::op1_range(), foperator_unordered_ge::op2_range(), foperator_unordered_lt::op2_range(), operator_ge::op2_range(), operator_ge::op2_range(), operator_ge::op2_range(), operator_lt::op2_range(), operator_lt::op2_range(), and operator_lt::op2_range().
References frange_add_zeros(), frange_val_min(), gcc_checking_assert, frange::known_isnan(), r, REAL_VALUE_TYPE, and frange::upper_bound().
Referenced by foperator_unordered_gt::op1_range(), foperator_unordered_le::op1_range(), operator_gt::op1_range(), operator_gt::op1_range(), operator_gt::op1_range(), operator_le::op1_range(), operator_le::op1_range(), operator_le::op1_range(), foperator_unordered_ge::op2_range(), foperator_unordered_lt::op2_range(), operator_ge::op2_range(), operator_ge::op2_range(), operator_ge::op2_range(), operator_lt::op2_range(), operator_lt::op2_range(), and operator_lt::op2_range().
References frange_nextafter(), frange_val_min(), gcc_checking_assert, HONOR_NANS(), frange::known_isnan(), MODE_COMPOSITE_P, r, real_isinf(), REAL_VALUE_TYPE, TYPE_MODE, and frange::upper_bound().
Referenced by foperator_unordered_ge::op1_range(), foperator_unordered_lt::op1_range(), operator_ge::op1_range(), operator_ge::op1_range(), operator_ge::op1_range(), operator_lt::op1_range(), operator_lt::op1_range(), operator_lt::op1_range(), foperator_unordered_gt::op2_range(), foperator_unordered_le::op2_range(), operator_gt::op2_range(), operator_gt::op2_range(), operator_gt::op2_range(), operator_le::op2_range(), operator_le::op2_range(), and operator_le::op2_range().
|
static |
References dconst0, and real_compare().
Referenced by operator_addr_expr::fold_range(), operator_logical_and::fold_range(), operator_equal::op1_op2_relation(), operator_equal::op1_op2_relation(), operator_ge::op1_op2_relation(), operator_ge::op1_op2_relation(), operator_gt::op1_op2_relation(), operator_gt::op1_op2_relation(), operator_le::op1_op2_relation(), operator_le::op1_op2_relation(), operator_lt::op1_op2_relation(), operator_lt::op1_op2_relation(), operator_not_equal::op1_op2_relation(), operator_not_equal::op1_op2_relation(), foperator_div::op1_range(), operator_addr_expr::op1_range(), operator_bitwise_xor::op1_range(), operator_cast::op1_range(), operator_lshift::op1_range(), operator_mult::op1_range(), operator_rshift::op1_range(), foperator_div::op2_range(), foperator_div::rv_fold(), operator_mult::rv_fold(), and set_nonzero_range_from_mask().
|
static |
References i, real_isnegzero(), real_iszero(), and real_less().
Referenced by foperator_div::rv_fold(), and operator_mult::rv_fold().
|
static |
References dconst0, frange_drop_infs(), r, real_compare(), and real_isinf().
Referenced by foperator_div::op1_range(), operator_minus::op1_range(), operator_mult::op1_range(), operator_plus::op1_range(), foperator_div::op2_range(), and operator_minus::op2_range().
Extend the LHS range by 1ulp in each direction. For op1_range or op2_range of binary operations just computing the inverse operation on ranges isn't sufficient. Consider e.g. [1., 1.] = op1 + [1., 1.]. op1's range is not [0., 0.], but [-0x1.0p-54, 0x1.0p-53] (when not -frounding-math), any value for which adding 1. to it results in 1. after rounding to nearest. So, for op1_range/op2_range extend the lhs range by 1ulp (or 0.5ulp) in each direction. See PR109008 for more details.
References dconst1, dconst2, dconstinf, dconstm1, dconstninf, FLOAT_MODE_FORMAT, frange_nextafter(), MODE_COMPOSITE_P, real_arithmetic(), real_isfinite(), real_isinf(), REAL_VALUE_TYPE, frange::set(), SET_REAL_EXP, and TYPE_MODE.
Referenced by foperator_div::op1_range(), operator_minus::op1_range(), operator_mult::op1_range(), operator_plus::op1_range(), foperator_div::op2_range(), and operator_minus::op2_range().
References HONOR_SIGNED_ZEROS(), r, and real_iszero().
Referenced by build_ge(), build_le(), foperator_ltgt::op1_range(), foperator_unordered_equal::op1_range(), operator_equal::op1_range(), and operator_not_equal::op1_range().
void frange_arithmetic | ( | enum tree_code | code, |
tree | type, | ||
REAL_VALUE_TYPE & | result, | ||
const REAL_VALUE_TYPE & | op1, | ||
const REAL_VALUE_TYPE & | op2, | ||
const REAL_VALUE_TYPE & | inf ) |
References frange_nextafter(), MODE_COMPOSITE_P, real_arithmetic(), real_convert(), real_equal(), REAL_EXP, real_identical(), real_isdenormal(), real_isinf(), real_isneg(), real_iszero(), real_less(), REAL_MODE_FORMAT, real_nextafter(), REAL_VALUE_TYPE, and TYPE_MODE.
Referenced by cfn_sqrt::op1_range(), foperator_div::rv_fold(), operator_minus::rv_fold(), operator_mult::rv_fold(), and operator_plus::rv_fold().
References r, real_max_representable(), and REAL_VALUE_TYPE.
Referenced by operator_lt::op1_range(), and operator_gt::op2_range().
References r, real_max_representable(), real_min_representable(), and REAL_VALUE_TYPE.
Referenced by float_binary_op_range_finish().
References r, real_min_representable(), and REAL_VALUE_TYPE.
Referenced by operator_gt::op1_range(), and operator_lt::op2_range().
void frange_nextafter | ( | enum machine_mode | mode, |
REAL_VALUE_TYPE & | value, | ||
const REAL_VALUE_TYPE & | inf ) |
References MODE_COMPOSITE_P, real_convert(), real_isdenormal(), real_iszero(), REAL_MODE_FORMAT, real_nextafter(), and REAL_VALUE_TYPE.
Referenced by build_gt(), build_lt(), float_widen_lhs_range(), cfn_sincos::fold_range(), cfn_sqrt::fold_range(), frange_arithmetic(), frange_mpfr_arg1(), cfn_sincos::op1_range(), and cfn_sqrt::op1_range().
|
inlinestatic |
References empty_range_varying(), maybe_isnan(), relation_trio::op1_op2(), r, range_false(), range_true(), relation_intersect(), relation_union(), and VREL_UNDEFINED.
Referenced by operator_equal::fold_range(), operator_ge::fold_range(), operator_gt::fold_range(), operator_le::fold_range(), operator_lt::fold_range(), and operator_not_equal::fold_range().
|
static |
References dconstinf, and dconstninf.
Referenced by foperator_div::rv_fold(), and operator_mult::rv_fold().
References frange::maybe_isnan().
Referenced by foperator_ltgt::fold_range(), foperator_unordered_equal::fold_range(), foperator_unordered_ge::fold_range(), foperator_unordered_gt::fold_range(), foperator_unordered_le::fold_range(), foperator_unordered_lt::fold_range(), operator_equal::fold_range(), operator_ge::fold_range(), operator_gt::fold_range(), operator_le::fold_range(), operator_lt::fold_range(), operator_not_equal::fold_range(), and frelop_early_resolve().
|
static |
References real_isneg().
Referenced by foperator_div::op1_range(), operator_mult::op1_range(), foperator_div::op2_range(), foperator_div::rv_fold(), and operator_mult::rv_fold().
|
static |
References real_isinf(), and real_isneg().
Referenced by foperator_div::rv_fold(), and operator_mult::rv_fold().
|
static |
References real_iszero().
Referenced by foperator_div::rv_fold(), operator_mult::rv_fold(), and sbr_vector::sbr_vector().
|
static |
References dconst0, and dconstm0.
Referenced by foperator_div::rv_fold(), and operator_mult::rv_fold().
|
static |
References dconst0, dconstinf, dconstm0, and dconstninf.
Referenced by foperator_div::op1_range(), operator_mult::op1_range(), foperator_div::op2_range(), foperator_div::rv_fold(), and operator_mult::rv_fold().
foperator_div fop_div |
Referenced by range_op_table::initialize_float_ops().
foperator_ltgt fop_ltgt |
Referenced by range_op_table::initialize_float_ops().
foperator_ordered fop_ordered |
Referenced by range_op_table::initialize_float_ops().
foperator_unordered fop_unordered |
Referenced by range_op_table::initialize_float_ops().
foperator_unordered_equal fop_unordered_equal |
Referenced by range_op_table::initialize_float_ops().
foperator_unordered_ge fop_unordered_ge |
Referenced by range_op_table::initialize_float_ops().
foperator_unordered_gt fop_unordered_gt |
Referenced by range_op_table::initialize_float_ops().
foperator_unordered_le fop_unordered_le |
Referenced by range_op_table::initialize_float_ops().
foperator_unordered_lt fop_unordered_lt |
Referenced by range_op_table::initialize_float_ops().