aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2023-05-31 17:02:00 -0400
committerAndrew MacLeod <amacleod@redhat.com>2023-06-09 12:31:20 -0400
commitc570818b436fde04bbb86755601c741711fd72a0 (patch)
tree8c7a97d873a03196410c07add2d668404f36c8df /gcc
parent953bbeaeff050f4d0b670568a587aa1ce82ed711 (diff)
downloadgcc-c570818b436fde04bbb86755601c741711fd72a0.zip
gcc-c570818b436fde04bbb86755601c741711fd72a0.tar.gz
gcc-c570818b436fde04bbb86755601c741711fd72a0.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/range-op.cc18
-rw-r--r--gcc/range-op.h44
2 files changed, 43 insertions, 19 deletions
diff --git a/gcc/range-op.cc b/gcc/range-op.cc
index 4d122de..44a95b2 100644
--- a/gcc/range-op.cc
+++ b/gcc/range-op.cc
@@ -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"
diff --git a/gcc/range-op.h b/gcc/range-op.h
index 7af5873..2abec32 100644
--- a/gcc/range-op.h
+++ b/gcc/range-op.h
@@ -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,