21#include <llvm/ADT/APSInt.h>
22#include <llvm/ADT/StringRef.h>
25#include <initializer_list>
36llvm::APSInt
expandingAdd(llvm::APSInt lhs, llvm::APSInt rhs);
45llvm::APSInt
expandingSub(llvm::APSInt lhs, llvm::APSInt rhs);
54llvm::APSInt
expandingMul(llvm::APSInt lhs, llvm::APSInt rhs);
58std::strong_ordering
safeCmp(llvm::APSInt lhs, llvm::APSInt rhs);
66inline bool safeLt(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
67 return std::is_lt(
safeCmp(lhs, rhs));
70inline bool safeLe(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
71 return std::is_lteq(
safeCmp(lhs, rhs));
74inline bool safeEq(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
75 return std::is_eq(
safeCmp(lhs, rhs));
78inline bool safeNe(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
79 return std::is_neq(
safeCmp(lhs, rhs));
82inline bool safeGt(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
83 return std::is_gt(
safeCmp(lhs, rhs));
86inline bool safeGe(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
87 return std::is_gteq(
safeCmp(lhs, rhs));
90inline llvm::APSInt
safeMin(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
91 return std::min(lhs, rhs,
safeLt);
94inline llvm::APSInt
safeMin(std::initializer_list<llvm::APSInt> ilist) {
95 return std::min(ilist,
safeLt);
98inline llvm::APSInt
safeMax(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
99 return std::max(lhs, rhs,
safeLt);
102inline llvm::APSInt
safeMax(std::initializer_list<llvm::APSInt> ilist) {
103 return std::max(ilist,
safeLt);
llvm::APSInt safeToSigned(llvm::APSInt i)
Safely converts the given int to a signed int if it is an unsigned int by adding an extra bit for the...
std::strong_ordering safeCmp(llvm::APSInt lhs, llvm::APSInt rhs)
Compares lhs and rhs, regardless of the bitwidth of lhs and rhs.
llvm::APSInt safeMax(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
llvm::APSInt expandingAdd(llvm::APSInt lhs, llvm::APSInt rhs)
Safely add lhs and rhs, expanding the width of the result as necessary.
llvm::APSInt expandingSub(llvm::APSInt lhs, llvm::APSInt rhs)
Safely subtract lhs and rhs, expanding the width of the result as necessary.
bool safeGt(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
bool safeEq(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
bool safeLt(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
llvm::APSInt expandingMul(llvm::APSInt lhs, llvm::APSInt rhs)
Safely multiple lhs and rhs, expanding the width of the result as necessary.
bool safeLe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
bool safeNe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
bool safeGe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
llvm::APSInt safeMin(const llvm::APSInt &lhs, const llvm::APSInt &rhs)