const irange &rh) const final override;
// Check op1 and op2 for compatibility.
bool operand_check_p (tree, tree t1, tree t2) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
};
class operator_not_equal : public range_operator
const irange &rh) const final override;
// Check op1 and op2 for compatibility.
bool operand_check_p (tree, tree t1, tree t2) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
};
class operator_lt : public range_operator
const irange &rh) const final override;
// Check op1 and op2 for compatibility.
bool operand_check_p (tree, tree t1, tree t2) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
};
class operator_le : public range_operator
const irange &rh) const final override;
// Check op1 and op2 for compatibility.
bool operand_check_p (tree, tree t1, tree t2) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
};
class operator_gt : public range_operator
const irange &rh) const final override;
// Check op1 and op2 for compatibility.
bool operand_check_p (tree, tree t1, tree t2) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
};
class operator_ge : public range_operator
const irange &rh) const final override;
// Check op1 and op2 for compatibility.
bool operand_check_p (tree, tree t1, tree t2) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
};
class operator_identity : public range_operator
relation_trio = TRIO_VARYING) const;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
private:
void wi_fold (irange &r, tree type, const wide_int &lh_lb,
const wide_int &lh_ub, const wide_int &rh_lb,
const irange &rh) const final override;
// Check compatibility of LHS and op1.
bool operand_check_p (tree t1, tree t2, tree) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
private:
void wi_fold (irange &r, tree type, const wide_int &lh_lb,
const wide_int &lh_ub, const wide_int &rh_lb,
relation_trio = TRIO_VARYING) const;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
private:
void wi_fold (irange &r, tree type, const wide_int &lh_lb,
const wide_int &lh_ub, const wide_int &rh_lb,
relation_trio rel = TRIO_VARYING) const final override;
// Check compatibility of LHS and op1.
bool operand_check_p (tree t1, tree t2, tree) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
};
relation_trio = TRIO_VARYING) const;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
};
class operator_addr_expr : public range_operator
const irange &rh) const final override;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
};
class operator_bitwise_xor : public range_operator
const irange &rh) const final override;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
private:
void wi_fold (irange &r, tree type, const wide_int &lh_lb,
const wide_int &lh_ub, const wide_int &rh_lb,
const irange &rh) const override;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
protected:
void wi_fold (irange &r, tree type, const wide_int &lh_lb,
const wide_int &lh_ub, const wide_int &rh_lb,
const irange &rh) const override;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
protected:
void wi_fold (irange &r, tree type, const wide_int &lh_lb,
const wide_int &lh_ub, const wide_int &rh_lb,
const irange &rh) const override;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
protected:
void wi_fold (irange &r, tree type, const wide_int &lh_lb,
const wide_int &lh_ub, const wide_int &rh_lb,
const irange &rh) const override;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
protected:
void wi_fold (irange &r, tree type, const wide_int &lh_lb,
const wide_int &lh_ub, const wide_int &rh_lb,
{ update_known_bitmask (r, LSHIFT_EXPR, lh, rh); }
// Check compatibility of LHS and op1.
bool operand_check_p (tree t1, tree t2, tree) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
} op_lshift;
class operator_rshift : public cross_product_operator
{ update_known_bitmask (r, RSHIFT_EXPR, lh, rh); }
// Check compatibility of LHS and op1.
bool operand_check_p (tree t1, tree t2, tree) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
} op_rshift;
relation_trio rel = TRIO_VARYING) const;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
} op_logical_and;
bool
relation_trio rel = TRIO_VARYING) const;
// Check compatibility of all operands.
bool operand_check_p (tree t1, tree t2, tree t3) const final override
- { return (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
- && TYPE_PRECISION (t1) == TYPE_PRECISION (t3)); }
+ { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
} op_logical_or;
bool
relation_trio rel = TRIO_VARYING) const;
// Check compatibility of LHS and op1.
bool operand_check_p (tree t1, tree t2, tree) const final override
- { return TYPE_PRECISION (t1) == TYPE_PRECISION (t2); }
+ { return range_compatible_p (t1, t2); }
} op_logical_not;
// Folding a logical NOT, oddly enough, involves doing nothing on the