On Thu, May 12, 2011 at 9:59 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Thu, May 12, 2011 at 11:19 AM, Kai Tietz <ktiet...@googlemail.com> wrote:
>> 2011/5/12 Richard Guenther <richard.guent...@gmail.com>:
>>> On Thu, May 12, 2011 at 3:29 PM, Kai Tietz <ktiet...@googlemail.com> wrote:
>>>> While testing some other issues with C++'s __java_boolean type
>>>> occurred. So I adjusted check in test-cfg.c as you suggested.
>>>> Additionally due the fact that we are now boolifying conditions for
>>>> even BOOLEAN_TYPE'ed cases (for making sure inner arms are boolified,
>>>> too), we possibly would alter here truth-type provided by FE. To
>>>> restore original type (for types != boolean-type), we do type
>>>> conversion always back to FE's used type for truth-AND/OR/XOR/etc as
>>>> result.
>>>
>>> boolean_type_node is the only BOOLEAN_TYPE node we have,
>>> so please remove the !=/== boolean_type_node checks again, or,
>>> if you want more visual consistency with the adjustment gimple_boolify
>>> makes replace them with !=/== boolean_type_node comparisons
>>> completely.
>>>
>>> Ok with either change.
>>>
>>> Thanks,
>>> Richard.
>>>
>>>> Patch bootstrapped with all languages on x86_64-pc-linux-gnu
>>>> (multilib). Ok for apply?
>>>>
>>>> Regards,
>>>> Kai
>>>>
>>>> Index: gcc/gcc/gimplify.c
>>>> ===================================================================
>>>> --- gcc.orig/gcc/gimplify.c     2011-05-12 09:02:58.946243000 +0200
>>>> +++ gcc/gcc/gimplify.c  2011-05-12 15:13:59.534550700 +0200
>>>> @@ -2824,9 +2824,6 @@ gimple_boolify (tree expr)
>>>>        }
>>>>     }
>>>>
>>>> -  if (TREE_CODE (type) == BOOLEAN_TYPE)
>>>> -    return expr;
>>>> -
>>>>   switch (TREE_CODE (expr))
>>>>     {
>>>>     case TRUTH_AND_EXPR:
>>>> @@ -2851,6 +2848,9 @@ gimple_boolify (tree expr)
>>>>     default:
>>>>       /* Other expressions that get here must have boolean values, but
>>>>         might need to be converted to the appropriate mode.  */
>>>> +      if (TREE_CODE (type) == BOOLEAN_TYPE
>>>> +          && type == boolean_type_node)
>>>> +       return expr;
>>>>       return fold_convert_loc (loc, boolean_type_node, expr);
>>>>     }
>>>>  }
>>>> @@ -4695,31 +4695,6 @@ gimplify_scalar_mode_aggregate_compare (
>>>>   return GS_OK;
>>>>  }
>>>>
>>>> -/* Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions.  EXPR_P
>>>> -   points to the expression to gimplify.
>>>> -
>>>> -   Expressions of the form 'a && b' are gimplified to:
>>>> -
>>>> -       a && b ? true : false
>>>> -
>>>> -   LOCUS is the source location to be put on the generated COND_EXPR.
>>>> -   gimplify_cond_expr will do the rest.  */
>>>> -
>>>> -static enum gimplify_status
>>>> -gimplify_boolean_expr (tree *expr_p, location_t locus)
>>>> -{
>>>> -  /* Preserve the original type of the expression.  */
>>>> -  tree type = TREE_TYPE (*expr_p);
>>>> -
>>>> -  *expr_p = build3 (COND_EXPR, type, *expr_p,
>>>> -                   fold_convert_loc (locus, type, boolean_true_node),
>>>> -                   fold_convert_loc (locus, type, boolean_false_node));
>>>> -
>>>> -  SET_EXPR_LOCATION (*expr_p, locus);
>>>> -
>>>> -  return GS_OK;
>>>> -}
>>>> -
>>>>  /* Gimplify an expression sequence.  This function gimplifies each
>>>>    expression and rewrites the original expression with the last
>>>>    expression of the sequence in GIMPLE form.
>>>> @@ -6762,12 +6737,26 @@ gimplify_expr (tree *expr_p, gimple_seq
>>>>
>>>>        case TRUTH_ANDIF_EXPR:
>>>>        case TRUTH_ORIF_EXPR:
>>>> -         /* Pass the source location of the outer expression.  */
>>>> -         ret = gimplify_boolean_expr (expr_p, saved_location);
>>>> -         break;
>>>> +         {
>>>> +           /* Preserve the original type of the expression and the
>>>> +              source location of the outer expression.  */
>>>> +           tree org_type = TREE_TYPE (*expr_p);
>>>> +           *expr_p = gimple_boolify (*expr_p);
>>>> +           *expr_p = build3_loc (saved_location, COND_EXPR,
>>>> +                                 org_type, *expr_p,
>>>> +                                 fold_convert_loc
>>>> +                                   (saved_location,
>>>> +                                    org_type, boolean_true_node),
>>>> +                                 fold_convert_loc
>>>> +                                   (saved_location,
>>>> +                                    org_type, boolean_false_node));
>>>> +           ret = GS_OK;
>>>> +           break;
>>>> +         }
>>>>
>>>>        case TRUTH_NOT_EXPR:
>>>> -         if (TREE_CODE (TREE_TYPE (*expr_p)) != BOOLEAN_TYPE)
>>>> +         if (TREE_CODE (TREE_TYPE (*expr_p)) != BOOLEAN_TYPE
>>>> +             || TREE_CODE (TREE_TYPE (*expr_p)) != boolean_type_node)
>>>>            {
>>>>              tree type = TREE_TYPE (*expr_p);
>>>>              *expr_p = fold_convert (type, gimple_boolify (*expr_p));
>>>> @@ -7203,6 +7192,24 @@ gimplify_expr (tree *expr_p, gimple_seq
>>>>        case TRUTH_AND_EXPR:
>>>>        case TRUTH_OR_EXPR:
>>>>        case TRUTH_XOR_EXPR:
>>>> +         {
>>>> +           tree org_type = TREE_TYPE (*expr_p);
>>>> +
>>>> +           *expr_p = gimple_boolify (*expr_p);
>>>> +
>>>> +           /* This shouldn't happen, but due fold-const (and here 
>>>> especially
>>>> +              fold_truth_not_expr) happily uses operand type and doesn't
>>>> +              automatically uses boolean_type as result, we need to keep
>>>> +              orignal type.  */
>>>> +           if (TREE_CODE (org_type) != BOOLEAN_TYPE
>>>> +               || TREE_CODE (TREE_TYPE (org_type)) != boolean_type_node)
>>>> +             {
>>>> +               *expr_p = fold_convert (org_type, *expr_p);
>>>> +               ret = GS_OK;
>>>> +               break;
>>>> +             }
>>>> +         }
>>>> +
>>>>          /* Classified as tcc_expression.  */
>>>>          goto expr_2;
>>>>
>>>> Index: gcc/gcc/tree-cfg.c
>>>> ===================================================================
>>>> --- gcc.orig/gcc/tree-cfg.c     2011-05-12 09:02:58.989243000 +0200
>>>> +++ gcc/gcc/tree-cfg.c  2011-05-12 14:50:19.656249100 +0200
>>>> @@ -3541,10 +3541,10 @@ do_pointer_plus_expr_check:
>>>>     case TRUTH_OR_EXPR:
>>>>     case TRUTH_XOR_EXPR:
>>>>       {
>>>> -       /* We allow any kind of integral typed argument and result.  */
>>>> -       if (!INTEGRAL_TYPE_P (rhs1_type)
>>>> -           || !INTEGRAL_TYPE_P (rhs2_type)
>>>> -           || !INTEGRAL_TYPE_P (lhs_type))
>>>> +       /* We allow only boolean typed or compatible argument and result.  
>>>> */
>>>> +       if (!useless_type_conversion_p (boolean_type_node,  rhs1_type)
>>>> +           || !useless_type_conversion_p (boolean_type_node,  rhs2_type)
>>>> +           || !useless_type_conversion_p (boolean_type_node,  lhs_type))
>>>>          {
>>>>            error ("type mismatch in binary truth expression");
>>>>            debug_generic_expr (lhs_type);
>>>>
>>>
>>
>> Committed at revision 173711 with removing check for !=/== boolean_type_node.
>>
>
> This caused:
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48984

Appearantly a check for boolean_type_node would have been better
then.  It seems the Fortran FE has multiple BOOLEAN_TYPE
types.

Richard.

>
> --
> H.J.
>

Reply via email to