From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7974 invoked by alias); 27 May 2011 13:10:58 -0000 Received: (qmail 7784 invoked by uid 22791); 27 May 2011 13:10:57 -0000 X-SWARE-Spam-Status: No, hits=-3.3 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 27 May 2011 13:10:42 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 511BA86391 for ; Fri, 27 May 2011 15:10:41 +0200 (CEST) Date: Fri, 27 May 2011 14:01:00 -0000 From: Richard Guenther To: gcc-patches@gcc.gnu.org Subject: [PATCH] Fix PR49189 Message-ID: User-Agent: Alpine 2.00 (LNX 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-05/txt/msg02158.txt.bz2 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 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;