public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Guenther <rguenther@suse.de>
To: gcc-patches@gcc.gnu.org
Subject: [PATCH] Fix PR49189
Date: Fri, 27 May 2011 14:01:00 -0000	[thread overview]
Message-ID: <alpine.LNX.2.00.1105271509530.810@zhemvz.fhfr.qr> (raw)


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  <rguenther@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;

             reply	other threads:[~2011-05-27 13:10 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-27 14:01 Richard Guenther [this message]
2011-05-27 16:42 ` Eric Botcazou

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.LNX.2.00.1105271509530.810@zhemvz.fhfr.qr \
    --to=rguenther@suse.de \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).