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. >