]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Relocate range_cast to header, and add a generic version.
authorAndrew MacLeod <amacleod@redhat.com>
Wed, 31 May 2023 21:02:00 +0000 (17:02 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Fri, 9 Jun 2023 16:31:20 +0000 (12:31 -0400)
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.

gcc/range-op.cc
gcc/range-op.h

index 4d122de30262ced8ebd43faf84e31b0e6ac1eb8a..44a95b20ffa84854eb6aad8215809f1321cb6832 100644 (file)
@@ -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"
 
index 7af58736c3f26779531b4c903f67b53b6f85acc5..2abec3299efaf578b8913e25ecc2a912b7aba9f7 100644 (file)
@@ -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,