re PR middle-end/49177 (FAIL: gcc.dg/vect/fast-math-ifcvt-1.c)
authorRichard Biener <rguenth@gcc.gnu.org>
Fri, 27 May 2011 10:32:14 +0000 (10:32 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 27 May 2011 10:32:14 +0000 (10:32 +0000)
2011-05-27  Richard Guenther  <rguenther@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.

From-SVN: r174326

gcc/ChangeLog
gcc/fold-const.c

index 2bc9180eb08efa50ab10116959509fc3ebd5d041..14151341640391e8bdf2f2be65336c175f7b04aa 100644 (file)
@@ -1,21 +1,30 @@
+2011-05-27  Richard Guenther  <rguenther@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.
+
 2011-05-27  Jan Hubicka  <jh@suse.cz>
 
        * lto-streamer-out.c (lto_string_index): break out from...; offset by 1
        so 0 means NULL string.
        (lto_output_string_with_length): ... here.
-       (lto_output_string, output_string_cst, output_identifier): Update handling
-       of NULL strings.
+       (lto_output_string, output_string_cst, output_identifier): Update
+       handling of NULL strings.
        (lto_output_location_bitpack): New function.
        (lto_output_location): Use it.
        (lto_output_tree_ref): Use output_record_start.
-       (pack_ts_type_common_value_fields): Pack aliagn & alias set in var len values.
-       * lto-streamer-in.c (string_for_index): Break out from ...; offset values by 1.
+       (pack_ts_type_common_value_fields): Pack aliagn & alias set in var
+       len values.
+       * lto-streamer-in.c (string_for_index): Break out from ...; offset
+       values by 1.
        (input_string_internal): ... here; 
-       (input_string_cst, input_identifier, lto_input_string): Update handling of
-       NULL strings.
+       (input_string_cst, input_identifier, lto_input_string): Update handling
+       of NULL strings.
        (lto_input_location_bitpack): New function
        (lto_input_location): Use it.
-       (unpack_ts_type_common_value_fields): Pack align & alias in var len values.
+       (unpack_ts_type_common_value_fields): Pack align & alias in var len
+       values.
        * lto-streamer.h (bp_pack_val_len_unsigned, bp_pack_val_len_int,
        bp_unpack_val_len_unsigned, bp_unpack_val_len_int): Declare.
        (bp_pack_value): Sanity check the value range.
index c9c7afa068b17dca49c3f8c66564f4379ce070eb..ebb1d34d5f4cd7aa210ffdc218b1421a8d436ac8 100644 (file)
@@ -7657,11 +7657,19 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
       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))