This fixes PR49177 by re-introducing the removed folding in a correct way.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2011-05-27 Richard Guenther <rguent...@suse.de> PR middle-end/49177 * fold-const.c (fold_unary_loc): Fold (T)(A CMP B) to A CMP B ? (T) true : (T) false for non-integral types T again. Index: gcc/fold-const.c =================================================================== --- gcc/fold-const.c (revision 174321) +++ gcc/fold-const.c (working copy) @@ -7657,11 +7657,19 @@ fold_unary_loc (location_t loc, enum tre if (TREE_TYPE (op0) == type) return op0; - /* If we have (type) (a CMP b) and type is an integral type, return - new expression involving the new type. */ - if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type)) - return fold_build2_loc (loc, TREE_CODE (op0), type, TREE_OPERAND (op0, 0), - TREE_OPERAND (op0, 1)); + if (COMPARISON_CLASS_P (op0)) + { + /* If we have (type) (a CMP b) and type is an integral type, return + new expression involving the new type. */ + if (INTEGRAL_TYPE_P (type)) + return fold_build2_loc (loc, TREE_CODE (op0), type, + TREE_OPERAND (op0, 0), + TREE_OPERAND (op0, 1)); + else + return fold_build3_loc (loc, COND_EXPR, type, op0, + fold_convert (type, boolean_true_node), + fold_convert (type, boolean_false_node)); + } /* Handle cases of two conversions in a row. */ if (CONVERT_EXPR_P (op0))