[1/10] Add tree_fits_shwi_p and tree_fits_uhwi_p

Richard Sandiford rdsandiford@googlemail.com
Sat Nov 16 17:54:00 GMT 2013


Add tree_fits_shwi_p and tree_fits_uhwi_p.  The implementations are taken
directly from host_integerp.

Thanks,
Richard


gcc/
	* tree.h (tree_fits_shwi_p, tree_fits_uhwi_p): Declare.
	* tree.c (tree_fits_shwi_p, tree_fits_uhwi_p): Define.

Index: gcc/tree.h
===================================================================
--- gcc/tree.h	2013-11-16 09:09:56.388037088 +0000
+++ gcc/tree.h	2013-11-16 09:11:53.535874667 +0000
@@ -3659,6 +3659,16 @@ extern int host_integerp (const_tree, in
   ATTRIBUTE_PURE /* host_integerp is pure only when checking is disabled.  */
 #endif
   ;
+extern bool tree_fits_shwi_p (const_tree)
+#ifndef ENABLE_TREE_CHECKING
+  ATTRIBUTE_PURE /* tree_fits_shwi_p is pure only when checking is disabled.  */
+#endif
+  ;
+extern bool tree_fits_uhwi_p (const_tree)
+#ifndef ENABLE_TREE_CHECKING
+  ATTRIBUTE_PURE /* tree_fits_uhwi_p is pure only when checking is disabled.  */
+#endif
+  ;
 extern HOST_WIDE_INT tree_low_cst (const_tree, int);
 #if !defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 4003)
 extern inline __attribute__ ((__gnu_inline__)) HOST_WIDE_INT
Index: gcc/tree.c
===================================================================
--- gcc/tree.c	2013-11-16 09:09:56.388037088 +0000
+++ gcc/tree.c	2013-11-16 09:11:53.534874659 +0000
@@ -6990,6 +6990,32 @@ host_integerp (const_tree t, int pos)
 	      || (pos && TREE_INT_CST_HIGH (t) == 0)));
 }
 
+/* Return true if T is an INTEGER_CST whose numerical value (extended
+   according to TYPE_UNSIGNED) fits in a signed HOST_WIDE_INT.  */
+
+bool
+tree_fits_shwi_p (const_tree t)
+{
+  return (t != NULL_TREE
+	  && TREE_CODE (t) == INTEGER_CST
+	  && ((TREE_INT_CST_HIGH (t) == 0
+	       && (HOST_WIDE_INT) TREE_INT_CST_LOW (t) >= 0)
+	      || (TREE_INT_CST_HIGH (t) == -1
+		  && (HOST_WIDE_INT) TREE_INT_CST_LOW (t) < 0
+		  && !TYPE_UNSIGNED (TREE_TYPE (t)))));
+}
+
+/* Return true if T is an INTEGER_CST whose numerical value (extended
+   according to TYPE_UNSIGNED) fits in an unsigned HOST_WIDE_INT.  */
+
+bool
+tree_fits_uhwi_p (const_tree t)
+{
+  return (t != NULL_TREE
+	  && TREE_CODE (t) == INTEGER_CST
+	  && TREE_INT_CST_HIGH (t) == 0);
+}
+
 /* Return the HOST_WIDE_INT least significant bits of T if it is an
    INTEGER_CST and there is no overflow.  POS is nonzero if the result must
    be non-negative.  We must be able to satisfy the above conditions.  */



More information about the Gcc-patches mailing list