On Fri, Mar 01, 2019 at 12:19:36AM +0100, Eric Botcazou wrote:
> > I know Eric has committed a tweak here, but I view this magic handling as
> > something meant for boolean types only (if it is correct at all and the
> > right fix wouldn't be avoid the BIT_NOT_EXPR for the prec > 1 booleans, I
> > believe the expansion of BIT_NOT_EXPR doesn't have any special case for
> > BOOLEAN_TYPE).  This patch just restores previous behavior for non-boolean
> > types (basically inlines the first two cases from ssa_name_has_boolean_range
> > while leaving the problematic third one out, normal integral types with
> > just known value range of [0,1]).
> 
> IMO you haven't justified why this is problematic in the BIT_NOT_EXPR case 
> and 
> not in the BIT_AND_EXPR case...

The BIT_AND_EXPR case is clearly correct for all possible values.  The code
says that if the result of BIT_AND_EXPR is known to be a non-zero constant,
and one or both of the BIT_AND_EXPR arguments have known value ranges [0,1]
(or boolean or precision 1, not talking about those now), then that value
with the [0,1] range actually had to be 1, otherwise BIT_AND_EXPR result
would be 0.

The BIT_NOT_EXPR case is different, ~0 is -1 and ~1 is -2.  If an SSA_NAME
has [0,1] range, then BIT_NOT_EXPR of that will be [-2,-1].  If value is one
of those two, then with your today's patch the assumption will be correct, 1
or 0.  If value is some other one, which should hopefully happen only in dead
code that we haven't been able to optimize, then we'd replace different values
though.

        Jakub

Reply via email to