re PR middle-end/49189 (infinite recursion in constant folder)

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.

From-SVN: r174330
This commit is contained in:
Richard Guenther 2011-05-27 13:13:28 +00:00 committed by Richard Biener
parent a95b23b429
commit c2299dfe53
5 changed files with 60 additions and 7 deletions

View File

@ -1,3 +1,9 @@
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.
2011-05-27 Bernd Schmidt <bernds@codesourcery.com>
* haifa-sched.c (sched_scan_info): Remove.

View File

@ -7660,15 +7660,19 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
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. */
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 fold_build2_loc (loc, TREE_CODE (op0), type,
TREE_OPERAND (op0, 0),
TREE_OPERAND (op0, 1));
return 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));
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. */

View File

@ -1,3 +1,9 @@
2011-05-27 Richard Guenther <rguenther@suse.de>
PR middle-end/49189
* gnat.dg/bit_packed_array5.adb: New testcase.
* gnat.dg/bit_packed_array5.ads: Likewise.
2011-05-26 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/friend1.C: New.

View File

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

View File

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