GCC Middle and Back End API Reference
operator_exact_divide Class Reference
Inheritance diagram for operator_exact_divide:
Collaboration diagram for operator_exact_divide:

Public Member Functions

 operator_exact_divide ()
 
virtual bool op1_range (irange &r, tree type, const irange &lhs, const irange &op2, relation_trio) const
 
virtual void wi_fold (irange &r, tree type, const wide_int &lh_lb, const wide_int &lh_ub, const wide_int &rh_lb, const wide_int &rh_ub) const final override
 
virtual bool wi_op_overflows (wide_int &res, tree type, const wide_int &, const wide_int &) const final override
 
void update_bitmask (irange &r, const irange &lh, const irange &rh) const
 
void wi_cross_product (irange &r, tree type, const wide_int &lh_lb, const wide_int &lh_ub, const wide_int &rh_lb, const wide_int &rh_ub) const
 
virtual bool fold_range (irange &r, tree type, const irange &lh, const irange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool fold_range (frange &r, tree type, const frange &lh, const frange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool fold_range (irange &r, tree type, const frange &lh, const irange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool fold_range (irange &r, tree type, const frange &lh, const frange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool fold_range (frange &r, tree type, const irange &lh, const irange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool fold_range (prange &r, tree type, const prange &lh, const prange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool fold_range (prange &r, tree type, const prange &lh, const irange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool fold_range (irange &r, tree type, const prange &lh, const prange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool fold_range (prange &r, tree type, const irange &lh, const prange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool fold_range (irange &r, tree type, const prange &lh, const irange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool op2_range (irange &r, tree type, const irange &lhs, const irange &op1, relation_trio=TRIO_VARYING) const
 
virtual bool op2_range (prange &r, tree type, const irange &lhs, const prange &op1, relation_trio=TRIO_VARYING) const
 
virtual bool op2_range (irange &r, tree type, const prange &lhs, const prange &op1, relation_trio=TRIO_VARYING) const
 
virtual bool op2_range (frange &r, tree type, const frange &lhs, const frange &op1, relation_trio=TRIO_VARYING) const
 
virtual bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, relation_trio=TRIO_VARYING) const
 
virtual relation_kind lhs_op1_relation (const irange &lhs, const irange &op1, const irange &op2, relation_kind=VREL_VARYING) const
 
virtual relation_kind lhs_op1_relation (const prange &lhs, const prange &op1, const prange &op2, relation_kind=VREL_VARYING) const
 
virtual relation_kind lhs_op1_relation (const prange &lhs, const irange &op1, const irange &op2, relation_kind=VREL_VARYING) const
 
virtual relation_kind lhs_op1_relation (const irange &lhs, const prange &op1, const prange &op2, relation_kind=VREL_VARYING) const
 
virtual relation_kind lhs_op1_relation (const frange &lhs, const frange &op1, const frange &op2, relation_kind=VREL_VARYING) const
 
virtual relation_kind lhs_op1_relation (const irange &lhs, const frange &op1, const frange &op2, relation_kind=VREL_VARYING) const
 
virtual relation_kind lhs_op2_relation (const irange &lhs, const irange &op1, const irange &op2, relation_kind=VREL_VARYING) const
 
virtual relation_kind lhs_op2_relation (const frange &lhs, const frange &op1, const frange &op2, relation_kind=VREL_VARYING) const
 
virtual relation_kind lhs_op2_relation (const irange &lhs, const frange &op1, const frange &op2, relation_kind=VREL_VARYING) const
 
virtual relation_kind op1_op2_relation (const irange &lhs, const irange &op1, const irange &op2) const
 
virtual relation_kind op1_op2_relation (const irange &lhs, const prange &op1, const prange &op2) const
 
virtual relation_kind op1_op2_relation (const irange &lhs, const frange &op1, const frange &op2) const
 
virtual relation_kind op1_op2_relation (const frange &lhs, const frange &op1, const frange &op2) const
 
virtual bool overflow_free_p (const irange &lh, const irange &rh, relation_trio=TRIO_VARYING) const
 
virtual bool operand_check_p (tree, tree, tree) const
 

Protected Member Functions

virtual bool op1_op2_relation_effect (irange &lhs_range, tree type, const irange &op1_range, const irange &op2_range, relation_kind rel) const
 
virtual bool op1_op2_relation_effect (prange &lhs_range, tree type, const prange &op1_range, const prange &op2_range, relation_kind rel) const
 
virtual bool op1_op2_relation_effect (prange &lhs_range, tree type, const prange &op1_range, const irange &op2_range, relation_kind rel) const
 
virtual bool op1_op2_relation_effect (irange &lhs_range, tree type, const prange &op1_range, const prange &op2_range, relation_kind rel) const
 
virtual bool op1_op2_relation_effect (prange &lhs_range, tree type, const irange &op1_range, const prange &op2_range, relation_kind rel) const
 
virtual bool op1_op2_relation_effect (irange &lhs_range, tree type, const prange &op1_range, const irange &op2_range, relation_kind rel) const
 
void wi_fold_in_parts (irange &r, tree type, const wide_int &lh_lb, const wide_int &lh_ub, const wide_int &rh_lb, const wide_int &rh_ub) const
 
void wi_fold_in_parts_equiv (irange &r, tree type, const wide_int &lb, const wide_int &ub, unsigned limit) const
 
virtual void rv_fold (frange &r, tree type, const REAL_VALUE_TYPE &lh_lb, const REAL_VALUE_TYPE &lh_ub, const REAL_VALUE_TYPE &rh_lb, const REAL_VALUE_TYPE &rh_ub, relation_kind) const
 

Protected Attributes

tree_code m_code
 

Private Member Functions

virtual bool op1_range (irange &r, tree type, const irange &lhs, const irange &op2, relation_trio=TRIO_VARYING) const
 
virtual bool op1_range (prange &r, tree type, const prange &lhs, const prange &op2, relation_trio=TRIO_VARYING) const
 
virtual bool op1_range (prange &r, tree type, const irange &lhs, const prange &op2, relation_trio=TRIO_VARYING) const
 
virtual bool op1_range (prange &r, tree type, const prange &lhs, const irange &op2, relation_trio=TRIO_VARYING) const
 
virtual bool op1_range (irange &r, tree type, const prange &lhs, const irange &op2, relation_trio=TRIO_VARYING) const
 
virtual bool op1_range (frange &r, tree type, const frange &lhs, const frange &op2, relation_trio=TRIO_VARYING) const
 
virtual bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, relation_trio=TRIO_VARYING) const
 
virtual void update_bitmask (irange &, const irange &, const irange &) const
 
virtual void update_bitmask (irange &, const prange &, const prange &) const
 

Constructor & Destructor Documentation

◆ operator_exact_divide()

operator_exact_divide::operator_exact_divide ( )
inline

Member Function Documentation

◆ fold_range() [1/10]

bool range_operator::fold_range ( frange & r,
tree type,
const frange & op1,
const frange & op2,
relation_trio trio = TRIO_VARYING ) const
virtualinherited
Floating point range operators.
   Copyright (C) 2022-2024 Free Software Foundation, Inc.
   Contributed by Aldy Hernandez <aldyh@redhat.com>.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.   

Reimplemented in cfn_sqrt, cfn_sincos, cfn_copysign, cfn_constant_float_p, cfn_constant_p, cfn_pass_through_arg1, cfn_signbit, cfn_copysign, cfn_sqrt, cfn_sincos, cfn_toupper_tolower, cfn_ffs, cfn_popcount, cfn_clz, cfn_ctz, cfn_clrsb, cfn_ubsan, cfn_strlen, cfn_goacc_dim, cfn_parity, foperator_unordered, foperator_ordered, foperator_unordered_lt, foperator_unordered_le, foperator_unordered_gt, foperator_unordered_ge, foperator_unordered_equal, foperator_ltgt, operator_equal, operator_not_equal, operator_lt, operator_le, operator_gt, operator_ge, operator_identity, operator_cst, operator_cast, operator_abs, operator_minus, operator_negate, operator_addr_expr, operator_bitwise_not, operator_bitwise_and, operator_min, operator_max, pointer_plus_operator, operator_lshift, operator_rshift, operator_logical_and, operator_logical_or, operator_logical_not, operator_unknown, operator_abs, operator_identity, operator_cst, and operator_negate.

References empty_range_varying(), frange::known_isnan(), frange::lower_bound(), frange::maybe_isnan(), relation_trio::op1_op2(), r, range_operator::rv_fold(), and frange::upper_bound().

◆ fold_range() [2/10]

◆ fold_range() [3/10]

◆ fold_range() [4/10]

◆ fold_range() [5/10]

bool range_operator::fold_range ( irange & r,
tree type,
const irange & lh,
const irange & rh,
relation_trio trio = TRIO_VARYING ) const
virtualinherited

Reimplemented in cfn_parity, cfn_constant_p, cfn_toupper_tolower, cfn_ffs, cfn_clrsb, cfn_goacc_dim, cfn_popcount, cfn_ubsan, operator_logical_and, operator_logical_or, operator_logical_not, operator_bitwise_not, cfn_clz, cfn_ctz, cfn_constant_float_p, cfn_constant_p, cfn_pass_through_arg1, cfn_signbit, cfn_copysign, cfn_sqrt, cfn_sincos, cfn_toupper_tolower, cfn_ffs, cfn_popcount, cfn_clz, cfn_ctz, cfn_clrsb, cfn_ubsan, cfn_strlen, cfn_goacc_dim, cfn_parity, foperator_unordered, foperator_ordered, foperator_unordered_lt, foperator_unordered_le, foperator_unordered_gt, foperator_unordered_ge, foperator_unordered_equal, foperator_ltgt, operator_equal, operator_not_equal, operator_lt, operator_le, operator_gt, operator_ge, operator_identity, operator_cst, operator_cast, operator_abs, operator_minus, operator_negate, operator_addr_expr, operator_bitwise_not, operator_bitwise_and, operator_min, operator_max, pointer_plus_operator, operator_lshift, operator_rshift, operator_logical_and, operator_logical_or, operator_logical_not, operator_unknown, operator_unknown, operator_identity, operator_cst, operator_cast, operator_negate, operator_addr_expr, operator_lshift, operator_rshift, operator_equal, operator_not_equal, operator_lt, operator_le, operator_gt, operator_ge, and cfn_pass_through_arg1.

References empty_range_varying(), gcc_checking_assert, ggc_alloc(), relation_trio::op1_op2(), range_operator::op1_op2_relation_effect(), r, relation_equiv_p(), range_operator::update_bitmask(), range_operator::wi_fold_in_parts(), range_operator::wi_fold_in_parts_equiv(), and y.

Referenced by operator_lshift::fold_range(), operator_rshift::fold_range(), range_op_handler::fold_range(), operator_rshift::op1_range(), and foperator_div::op2_range().

◆ fold_range() [6/10]

◆ fold_range() [7/10]

◆ fold_range() [8/10]

◆ fold_range() [9/10]

◆ fold_range() [10/10]

bool range_operator::fold_range ( prange & r,
tree type,
const prange & lh,
const prange & rh,
relation_trio = TRIO_VARYING ) const
virtualinherited
Code for range operators.
   Copyright (C) 2017-2024 Free Software Foundation, Inc.
   Contributed by Andrew MacLeod <amacleod@redhat.com>
   and Aldy Hernandez <aldyh@redhat.com>.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.   

Reimplemented in cfn_constant_float_p, cfn_constant_p, cfn_pass_through_arg1, cfn_signbit, cfn_copysign, cfn_sqrt, cfn_sincos, cfn_toupper_tolower, cfn_ffs, cfn_popcount, cfn_clz, cfn_ctz, cfn_clrsb, cfn_ubsan, cfn_strlen, cfn_goacc_dim, cfn_parity, foperator_unordered, foperator_ordered, foperator_unordered_lt, foperator_unordered_le, foperator_unordered_gt, foperator_unordered_ge, foperator_unordered_equal, foperator_ltgt, operator_equal, operator_not_equal, operator_lt, operator_le, operator_gt, operator_ge, operator_identity, operator_cst, operator_cast, operator_abs, operator_minus, operator_negate, operator_addr_expr, operator_bitwise_not, operator_bitwise_and, operator_min, operator_max, pointer_plus_operator, operator_lshift, operator_rshift, operator_logical_and, operator_logical_or, operator_logical_not, operator_unknown, operator_identity, operator_cst, operator_cast, operator_bitwise_and, operator_min, operator_max, and cfn_pass_through_arg1.

◆ lhs_op1_relation() [1/6]

relation_kind range_operator::lhs_op1_relation ( const frange & lhs,
const frange & op1,
const frange & op2,
relation_kind = VREL_VARYING ) const
virtualinherited

◆ lhs_op1_relation() [2/6]

◆ lhs_op1_relation() [3/6]

◆ lhs_op1_relation() [4/6]

relation_kind range_operator::lhs_op1_relation ( const irange & lhs,
const prange & op1,
const prange & op2,
relation_kind rel = VREL_VARYING ) const
virtualinherited

◆ lhs_op1_relation() [5/6]

relation_kind range_operator::lhs_op1_relation ( const prange & lhs,
const irange & op1,
const irange & op2,
relation_kind rel = VREL_VARYING ) const
virtualinherited

◆ lhs_op1_relation() [6/6]

◆ lhs_op2_relation() [1/3]

relation_kind range_operator::lhs_op2_relation ( const frange & lhs,
const frange & op1,
const frange & op2,
relation_kind = VREL_VARYING ) const
virtualinherited

Reimplemented in operator_plus.

References VREL_VARYING.

◆ lhs_op2_relation() [2/3]

relation_kind range_operator::lhs_op2_relation ( const irange & lhs,
const frange & op1,
const frange & op2,
relation_kind = VREL_VARYING ) const
virtualinherited

Reimplemented in operator_plus.

◆ lhs_op2_relation() [3/3]

relation_kind range_operator::lhs_op2_relation ( const irange & lhs,
const irange & op1,
const irange & op2,
relation_kind rel = VREL_VARYING ) const
virtualinherited

Reimplemented in operator_plus, and operator_plus.

References VREL_VARYING.

Referenced by range_op_handler::lhs_op2_relation().

◆ op1_op2_relation() [1/4]

relation_kind range_operator::op1_op2_relation ( const frange & lhs,
const frange & op1,
const frange & op2 ) const
virtualinherited

◆ op1_op2_relation() [2/4]

relation_kind range_operator::op1_op2_relation ( const irange & lhs,
const frange & op1,
const frange & op2 ) const
virtualinherited

◆ op1_op2_relation() [3/4]

◆ op1_op2_relation() [4/4]

relation_kind range_operator::op1_op2_relation ( const irange & lhs,
const prange & op1,
const prange & op2 ) const
virtualinherited

◆ op1_op2_relation_effect() [1/6]

bool range_operator::op1_op2_relation_effect ( irange & lhs_range,
tree type,
const irange & op1_range,
const irange & op2_range,
relation_kind rel ) const
protectedvirtualinherited

◆ op1_op2_relation_effect() [2/6]

bool range_operator::op1_op2_relation_effect ( irange & lhs_range,
tree type,
const prange & op1_range,
const irange & op2_range,
relation_kind rel ) const
protectedvirtualinherited

◆ op1_op2_relation_effect() [3/6]

bool range_operator::op1_op2_relation_effect ( irange & lhs_range,
tree type,
const prange & op1_range,
const prange & op2_range,
relation_kind rel ) const
protectedvirtualinherited

◆ op1_op2_relation_effect() [4/6]

bool range_operator::op1_op2_relation_effect ( prange & lhs_range,
tree type,
const irange & op1_range,
const prange & op2_range,
relation_kind rel ) const
protectedvirtualinherited

◆ op1_op2_relation_effect() [5/6]

bool range_operator::op1_op2_relation_effect ( prange & lhs_range,
tree type,
const prange & op1_range,
const irange & op2_range,
relation_kind rel ) const
protectedvirtualinherited

◆ op1_op2_relation_effect() [6/6]

bool range_operator::op1_op2_relation_effect ( prange & lhs_range,
tree type,
const prange & op1_range,
const prange & op2_range,
relation_kind rel ) const
protectedvirtualinherited

◆ op1_range() [1/8]

bool range_operator::op1_range ( frange & r,
tree type,
const frange & lhs,
const frange & op2,
relation_trio = TRIO_VARYING ) const
privatevirtual

Reimplemented from range_operator.

◆ op1_range() [2/8]

bool range_operator::op1_range ( frange & r,
tree type,
const irange & lhs,
const frange & op2,
relation_trio = TRIO_VARYING ) const
privatevirtual

Reimplemented from range_operator.

◆ op1_range() [3/8]

bool operator_exact_divide::op1_range ( irange & r,
tree type,
const irange & lhs,
const irange & op2,
relation_trio  ) const
virtual

◆ op1_range() [4/8]

bool range_operator::op1_range ( irange & r,
tree type,
const irange & lhs,
const irange & op2,
relation_trio = TRIO_VARYING ) const
privatevirtual

Reimplemented from range_operator.

◆ op1_range() [5/8]

bool range_operator::op1_range ( irange & r,
tree type,
const prange & lhs,
const irange & op2,
relation_trio = TRIO_VARYING ) const
privatevirtual

Reimplemented from range_operator.

◆ op1_range() [6/8]

bool range_operator::op1_range ( prange & r,
tree type,
const irange & lhs,
const prange & op2,
relation_trio = TRIO_VARYING ) const
privatevirtual

Reimplemented from range_operator.

◆ op1_range() [7/8]

bool range_operator::op1_range ( prange & r,
tree type,
const prange & lhs,
const irange & op2,
relation_trio = TRIO_VARYING ) const
privatevirtual

Reimplemented from range_operator.

◆ op1_range() [8/8]

bool range_operator::op1_range ( prange & r,
tree type,
const prange & lhs,
const prange & op2,
relation_trio = TRIO_VARYING ) const
privatevirtual

Reimplemented from range_operator.

◆ op2_range() [1/5]

◆ op2_range() [2/5]

◆ op2_range() [3/5]

◆ op2_range() [4/5]

◆ op2_range() [5/5]

◆ operand_check_p()

◆ overflow_free_p()

bool range_operator::overflow_free_p ( const irange & lh,
const irange & rh,
relation_trio = TRIO_VARYING ) const
virtualinherited

◆ rv_fold()

void range_operator::rv_fold ( frange & r,
tree type,
const REAL_VALUE_TYPE & lh_lb,
const REAL_VALUE_TYPE & lh_ub,
const REAL_VALUE_TYPE & rh_lb,
const REAL_VALUE_TYPE & rh_ub,
relation_kind  ) const
protectedvirtualinherited

◆ update_bitmask() [1/3]

void range_operator::update_bitmask ( irange & ,
const irange & ,
const irange &  ) const
privatevirtualinherited

Reimplemented from range_operator.

◆ update_bitmask() [2/3]

void range_operator::update_bitmask ( irange & ,
const prange & ,
const prange &  ) const
privatevirtualinherited

Reimplemented from range_operator.

◆ update_bitmask() [3/3]

void operator_div::update_bitmask ( irange & r,
const irange & lh,
const irange & rh ) const
inlinevirtualinherited

◆ wi_cross_product()

◆ wi_fold()

void operator_div::wi_fold ( irange & r,
tree type,
const wide_int & lh_lb,
const wide_int & lh_ub,
const wide_int & rh_lb,
const wide_int & rh_ub ) const
finaloverridevirtualinherited

◆ wi_fold_in_parts()

void range_operator::wi_fold_in_parts ( irange & r,
tree type,
const wide_int & lh_lb,
const wide_int & lh_ub,
const wide_int & rh_lb,
const wide_int & rh_ub ) const
protectedinherited

◆ wi_fold_in_parts_equiv()

void range_operator::wi_fold_in_parts_equiv ( irange & r,
tree type,
const wide_int & lb,
const wide_int & ub,
unsigned limit ) const
protectedinherited

◆ wi_op_overflows()

bool operator_div::wi_op_overflows ( wide_int & res,
tree type,
const wide_int & w0,
const wide_int & w1 ) const
finaloverridevirtualinherited

Field Documentation

◆ m_code

tree_code operator_div::m_code
protectedinherited

The documentation for this class was generated from the following file: