On Wed, Jul 13, 2011 at 12:56 PM, Kai Tietz <ktiet...@googlemail.com> wrote:
> 2011/7/13 Richard Guenther <richard.guent...@gmail.com>:
>> On Wed, Jul 13, 2011 at 11:00 AM, Kai Tietz <ktiet...@googlemail.com> wrote:
>>> Hello,
>>>
>>> this patch fixes that for replaced uses, we call fold_stmt_inplace. 
>>> Additionally
>>> it adds to fold_gimple_assign the canonical form for X !=/== 1 -> X ==/!= 0 
>>> for
>>> X with one-bit precision type.
>>>
>>> ChangeLog gcc/
>>>
>>> 2011-07-13  Kai Tietz  <kti...@redhat.com>
>>>
>>>        * gimple-fold.c (fold_gimple_assign): Add normalization
>>>        for compares of 1-bit integer precision operands.
>>>        * tree-ssa-propagate.c (replace_uses_in): Call
>>>        fold_stmt_inplace on modified statement.
>>
>> err - sure not.  The caller already does that.
>>
>> Breakpoint 5, substitute_and_fold (get_value_fn=0xc269ae <get_value>,
>>    fold_fn=0, do_dce=1 '\001')
>>    at /space/rguenther/src/svn/trunk/gcc/tree-ssa-propagate.c:1134
>> 1134              if (get_value_fn)
>> D.2696_8 = a_1(D) != D.2704_10;
>>
>> (gdb) n
>> 1135                did_replace |= replace_uses_in (stmt, get_value_fn);
>> (gdb)
>> 1138              if (did_replace)
>> (gdb) call debug_gimple_stmt (stmt)
>> D.2696_8 = a_1(D) != 1;
>>
>> (gdb) p did_replace
>> $1 = 1 '\001'
>> (gdb) n
>> 1139                fold_stmt (&oldi);
>>
>> so figure out why fold_stmt does not do its work instead.  Which I
>> quickly checked in gdb and it dispatches to fold_binary with
>> boolean-typed arguments as a_1 != 1 where you can see the
>> canonical form for this is !(int) a_1 because of a bug I think.
>>
>>      /* bool_var != 1 becomes !bool_var. */
>>      if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
>>          && code == NE_EXPR)
>>        return fold_build1_loc (loc, TRUTH_NOT_EXPR, type,
>>                            fold_convert_loc (loc, type, arg0));
>>
>> at least I don't see why we need to convert arg0 to the type of the
>> comparison.
>
> Well, this type-cast is required by C specification - integer
> autopromotion - AFAIR.  So I don't think FE maintainer would be happy
> about this change.

?  fold-const.c isn't supposed to perform integer promotion.  It's input
will have integer promotions if the frontend requires them.  If they are
semantically not needed fold-const.c strips them away anyway.

> Nevertheless I saw this pattern before, and was wondering why we check
> here for boolean_type at all. This might be in Ada-case even a latent
> bug due type-precision, and it prevents signed case detection too.
> IMHO this check should look like that:
>
>      /* bool_var != 1 becomes !bool_var. */
>      if (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
>         && TYPE_PRECISION (TREE_TYPE (arg0)) == 1
>         && integer_onep (arg1) && code == NE_EXPR)
>        return fold_build1_loc (loc, TRUTH_NOT_EXPR, type,
>                            fold_convert_loc (loc, type, arg0));

No it should not.  The BOOLEAN_TYPE check is exactly correct.

> For thie BIT_NOT_EXPR variant, the cast of arg0 would be of course
> false, as ~(bool) is of course different in result then ~(int)
>
>> You need to improve your debugging skills and see why existing
>> transformations are not working before adding new ones.
>
> I work on that.
>
> Kai
>

Reply via email to