This fixes PR49189 by re-installing the non-folding of conversions of comparison results.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2011-05-27 Richard Guenther <rguent...@suse.de> PR middle-end/49189 * fold-const.c (fold_unary_loc): Do not re-fold folding conversions of comparisons. * gnat.dg/bit_packed_array5.adb: New testcase. * gnat.dg/bit_packed_array5.ads: Likewise. Index: gcc/fold-const.c =================================================================== *** gcc/fold-const.c (revision 174326) --- gcc/fold-const.c (working copy) *************** fold_unary_loc (location_t loc, enum tre *** 7660,7674 **** 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. */ --- 7660,7678 ---- 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. Canonicalize ! (type) (a CMP b) to (a CMP b) ? (type) true : (type) false for ! non-integral type. ! Do not fold the result as that would not simplify further, also ! folding again results in recursions. */ if (INTEGRAL_TYPE_P (type)) ! return build2_loc (loc, TREE_CODE (op0), type, ! TREE_OPERAND (op0, 0), ! TREE_OPERAND (op0, 1)); else ! return 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. */ Index: gcc/testsuite/gnat.dg/bit_packed_array5.adb =================================================================== *** gcc/testsuite/gnat.dg/bit_packed_array5.adb (revision 0) --- gcc/testsuite/gnat.dg/bit_packed_array5.adb (revision 0) *************** *** 0 **** --- 1,21 ---- + with System; + + package body Bit_Packed_Array5 is + + function Inv (Word : Word_Type) return Word_Type is + W : Word_Type := Word; + pragma Volatile (W); + + A_W : constant System.Address := W'Address; + + V : Short_Bit_Array_Type; + for V'Address use A_W; + pragma Volatile (V); + begin + for I in V'Range loop + V (I) := not V (I); + end loop; + return W; + end; + + end Bit_Packed_Array5; Index: gcc/testsuite/gnat.dg/bit_packed_array5.ads =================================================================== *** gcc/testsuite/gnat.dg/bit_packed_array5.ads (revision 0) --- gcc/testsuite/gnat.dg/bit_packed_array5.ads (revision 0) *************** *** 0 **** --- 1,16 ---- + -- { dg-do compile } + + package Bit_Packed_Array5 is + + type Bit_Array is array (Integer range <>) of Boolean; + pragma Pack (Bit_Array); + + type Short_Bit_Array_Type is new Bit_Array (0 .. 15); + for Short_Bit_Array_Type'Size use 16; + + type Word_Type is range 0 .. 65535; + for Word_Type'Size use 16; + + function Inv (Word : Word_Type) return Word_Type; + + end Bit_Packed_Array5;