On Thu, 2 Feb 2017, Jeff Law wrote:

> On 02/01/2017 01:21 AM, Richard Biener wrote:
> > 
> > +/* Nonzero if TYPE represents a (scalar) boolean type or type
> > +   in the middle-end compatible with it.  */
> > +
> > +#define INTEGRAL_BOOLEAN_TYPE_P(TYPE) \
> > +  (TREE_CODE (TYPE) == BOOLEAN_TYPE            \
> > +   || ((TREE_CODE (TYPE) == INTEGER_TYPE       \
> > +       || TREE_CODE (TYPE) == ENUMERAL_TYPE)   \
> > +       && TYPE_PRECISION (TYPE) == 1           \
> > +       && TYPE_UNSIGNED (TYPE)))
> > 
> > (just to quote what you proposed).
> And my suggestion is to move the PRECISION/UNSIGNED checks so that they're
> tested for BOOLEAN_TYPEs as well.
> 
> 
> > 
> > As of useless_type_conversion_p, I don't remember why we have
> > 
> >       /* Preserve conversions to/from BOOLEAN_TYPE if types are not
> >          of precision one.  */
> >       if (((TREE_CODE (inner_type) == BOOLEAN_TYPE)
> >            != (TREE_CODE (outer_type) == BOOLEAN_TYPE))
> >           && TYPE_PRECISION (outer_type) != 1)
> >         return false;
> > 
> > it came with r173854 where you see other BOOLEAN_TYPE
> > -> integral-type with precision 1 check changes, so a new predicate
> > is very welcome IMHO.
> Funny, it's your change ;-)  Looks like Kai added a gimple checker that
> verified that the operand of a TRUTH_NOT_EXPR must be compatible with
> boolean_type_node.
> 
> That check tripped (bz48989) on some Fortran code.  Your fix seems to imply
> that the Fortran front-end created non-1-precision BOOLEAN_TYPE object.

It used to override boolean_type_node which AFAIK it no longer does.

> 
> > 
> > all BOOLEAN_TYPEs but Adas have precision one and are unsigned
> > (their TYPE_SIZE may vary though).  Adas larger precision boolean
> > has only two valid values but needs to be able to encode some 'NaT'
> > state.
> > 
> > I think BOOLEAN_COMPATIBLE_TYPE_P would be misleading as it isn't
> > equal to types_compatible_p (boolean_type_node, t).
> > 
> > Maybe we want TWO_VALUED_UNSIGNED_INTEGRAL_TYPE_P ()? (ick)
> > I thought "BOOLEAN" covers TWO_VALUED_UNSIGNED well enough but
> > simply BOOLEAN_TYPE_P is easily confused with TREE_CODE () ==
> > BOOLEAN_TYPE.
> > 
> > I'm fine with changing the predicate to be more explicit, like
> > 
> > #define INTEGRAL_BOOLEAN_TYPE_P(TYPE) \
> >   (INTEGRAL_TYPE_P (TYPE) && TYPE_PRECISION (TYPE) == 1)
> > 
> > not sure if we really need the TYPE_UNSIGNED check?  The middle-end
> > has various places that just check for a 1-precision type when
> > asking for a boolean context.
> > 
> > So naming set aside, would you agree with the above definition?
> > (modulo a && TYPE_UNSIGNED (TYPE))?
> I could agree to that.  Alternately, we could restore the TYPE_PRECISION
> checks that Jakub removed in the vectorizer.

Yeah, I guess at this point I prefer a vectorizer-local fix.

Richard.

Reply via email to