[PATCH] TYPE_OVERFLOW_* cleanup

Marc Glisse marc.glisse@inria.fr
Wed Dec 10 19:11:00 GMT 2014


On Wed, 10 Dec 2014, Marek Polacek wrote:

> @@ -482,6 +487,15 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
>    || TREE_CODE (TYPE) == BOOLEAN_TYPE \
>    || TREE_CODE (TYPE) == INTEGER_TYPE)
>
> +/* Nonzero if TYPE represents an integral type, including complex
> +   and vector integer types.  */
> +
> +#define ANY_INTEGRAL_TYPE_P(TYPE)		\
> +  (INTEGRAL_TYPE_P (TYPE)			\
> +   || ((TREE_CODE (TYPE) == COMPLEX_TYPE 	\
> +        || VECTOR_TYPE_P (TYPE))		\
> +       && INTEGRAL_TYPE_P (TREE_TYPE (TYPE))))
> +
> /* Nonzero if TYPE represents a non-saturating fixed-point type.  */
>
> #define NON_SAT_FIXED_POINT_TYPE_P(TYPE) \
> @@ -771,7 +785,7 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
> /* True if overflow wraps around for the given integral type.  That
>    is, TYPE_MAX + 1 == TYPE_MIN.  */
> #define TYPE_OVERFLOW_WRAPS(TYPE) \
> -  (TYPE_UNSIGNED (TYPE) || flag_wrapv)
> +  (ANY_INTEGRAL_TYPE_CHECK(TYPE)->base.u.bits.unsigned_flag || flag_wrapv)
>
> /* True if overflow is undefined for the given integral type.  We may
>    optimize on the assumption that values in the type never overflow.
> @@ -781,13 +795,14 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
>    it will be appropriate to issue the warning immediately, and in
>    other cases it will be appropriate to simply set a flag and let the
>    caller decide whether a warning is appropriate or not.  */
> -#define TYPE_OVERFLOW_UNDEFINED(TYPE) \
> -  (!TYPE_UNSIGNED (TYPE) && !flag_wrapv && !flag_trapv && flag_strict_overflow)
> +#define TYPE_OVERFLOW_UNDEFINED(TYPE)				\
> +  (!ANY_INTEGRAL_TYPE_CHECK(TYPE)->base.u.bits.unsigned_flag	\
> +   && !flag_wrapv && !flag_trapv && flag_strict_overflow)
>
> /* True if overflow for the given integral type should issue a
>    trap.  */
> #define TYPE_OVERFLOW_TRAPS(TYPE) \
> -  (!TYPE_UNSIGNED (TYPE) && flag_trapv)
> +  (!ANY_INTEGRAL_TYPE_CHECK(TYPE)->base.u.bits.unsigned_flag && flag_trapv)
>
> /* True if an overflow is to be preserved for sanitization.  */
> #define TYPE_OVERFLOW_SANITIZED(TYPE)			\
> @@ -2990,6 +3005,20 @@ omp_clause_elt_check (tree __t, int __i,
>   return &__t->omp_clause.ops[__i];
> }
>
> +/* These checks have to be special cased.  */
> +
> +inline tree
> +any_integral_type_check (tree __t, const char *__f, int __l, const char *__g)
> +{
> +  if (!(INTEGRAL_TYPE_P (__t)
> +	|| ((TREE_CODE (__t) == COMPLEX_TYPE
> +	     || VECTOR_TYPE_P (__t))
> +	    && INTEGRAL_TYPE_P (TREE_TYPE (__t)))))
> +    tree_check_failed (__t, __f, __l, __g, BOOLEAN_TYPE, ENUMERAL_TYPE,
> +		       INTEGER_TYPE, 0);
> +  return __t;
> +}

Is there a particular reason why you are avoiding ANY_INTEGRAL_TYPE_P in
any_integral_type_check?

-- 
Marc Glisse



More information about the Gcc-patches mailing list