Commit fae1b38d by Joseph Myers Committed by Joseph Myers

re PR tree-optimization/16437 (New c-torture failures after bitfield patch)

	PR tree-optimization/16437
	* c-common.c (shorten_compare): Don't mark result of conversion to
	narrower signed type as overflowing.
	* fold-const.c (decode_field_reference): Determine whether
	signedness comes from outer type using precision rather than size.

testsuite:
	* gcc.c-torture/execute/bitfld-4.c: New test.

From-SVN: r84498
parent 7d3998a4
2004-07-11 Joseph S. Myers <jsm@polyomino.org.uk>
PR tree-optimization/16437
* c-common.c (shorten_compare): Don't mark result of conversion to
narrower signed type as overflowing.
* fold-const.c (decode_field_reference): Determine whether
signedness comes from outer type using precision rather than size.
2004-07-11 Phil Edwards <phil@codesourcery.com> 2004-07-11 Phil Edwards <phil@codesourcery.com>
* configure.ac: Alphabetize --enable-checking list, add * configure.ac: Alphabetize --enable-checking list, add
......
...@@ -1924,7 +1924,12 @@ shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr, ...@@ -1924,7 +1924,12 @@ shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr,
*restype_ptr = c_common_signed_type (*restype_ptr); *restype_ptr = c_common_signed_type (*restype_ptr);
if (TREE_TYPE (primop1) != *restype_ptr) if (TREE_TYPE (primop1) != *restype_ptr)
primop1 = convert (*restype_ptr, primop1); {
tree tmp = convert (*restype_ptr, primop1);
TREE_OVERFLOW (tmp) = TREE_OVERFLOW (primop1);
TREE_CONSTANT_OVERFLOW (tmp) = TREE_CONSTANT_OVERFLOW (primop1);
primop1 = tmp;
}
if (type != *restype_ptr) if (type != *restype_ptr)
{ {
minval = convert (*restype_ptr, minval); minval = convert (*restype_ptr, minval);
......
...@@ -3296,7 +3296,7 @@ decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize, ...@@ -3296,7 +3296,7 @@ decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
/* If the number of bits in the reference is the same as the bitsize of /* If the number of bits in the reference is the same as the bitsize of
the outer type, then the outer type gives the signedness. Otherwise the outer type, then the outer type gives the signedness. Otherwise
(in case of a small bitfield) the signedness is unchanged. */ (in case of a small bitfield) the signedness is unchanged. */
if (outer_type && *pbitsize == tree_low_cst (TYPE_SIZE (outer_type), 1)) if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
*punsignedp = TYPE_UNSIGNED (outer_type); *punsignedp = TYPE_UNSIGNED (outer_type);
/* Compute the mask to access the bitfield. */ /* Compute the mask to access the bitfield. */
......
2004-07-11 Joseph S. Myers <jsm@polyomino.org.uk>
PR tree-optimization/16437
* gcc.c-torture/execute/bitfld-4.c: New test.
2004-07-10 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> 2004-07-10 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
* gfortran.fortran-torture/execute/common_2.f90: Add check for * gfortran.fortran-torture/execute/common_2.f90: Add check for
......
/* When comparisons of bit-fields to unsigned constants got shortened,
the shortened signed constant was wrongly marked as overflowing,
leading to a later integer_zerop failure and misoptimization.
Related to bug tree-optimization/16437 but shows the problem on
32-bit systems. */
/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
extern void abort (void);
struct s { int a:12, b:20; };
struct s x = { -123, -456 };
int
main (void)
{
if (x.a != -123U || x.b != -456U)
abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment