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