+ {
+ tree type = ((ivtype_map_elt) *slot)->type;
+ int type_precision = TYPE_PRECISION (type);
+
+ /* Find the smallest signed type possible. */
+ if (!TYPE_UNSIGNED (type))
+ {
+ if (type_precision <= TYPE_PRECISION (integer_type_node))
+ return integer_type_node;
+
+ if (type_precision <= TYPE_PRECISION (long_integer_type_node))
+ return long_integer_type_node;
+
+ if (type_precision <= TYPE_PRECISION (long_long_integer_type_node))
+ return long_long_integer_type_node;
+
+ gcc_unreachable ();
+ }
+
+ if (type_precision < TYPE_PRECISION (integer_type_node))
+ return integer_type_node;
+
+ if (type_precision < TYPE_PRECISION (long_integer_type_node))
+ return long_integer_type_node;
+
+ if (type_precision < TYPE_PRECISION (long_long_integer_type_node))
+ return long_long_integer_type_node;
+
+ /* There is no signed type available, that is large enough to hold the
+ original value. */
+ gcc_unreachable ();
+ }