[PATCH] Fix PR49189

Richard Guenther rguenther@suse.de
Fri May 27 14:01:00 GMT 2011


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;



More information about the Gcc-patches mailing list