re PR middle-end/28045 (Bitfield, &&, and optimization => bad code generation)

2006-06-19  Richard Guenther  <rguenther@suse.de>

	PR middle-end/28045
	* fold-const.c (operand_equal_p): Check if the argument types
	have the same precision before stripping NOPs.

	* gcc.dg/torture/pr28045.c: New testcase.

From-SVN: r114772
This commit is contained in:
Richard Guenther 2006-06-19 14:48:47 +00:00 committed by Richard Biener
parent 46b86adcdc
commit 096dce1b1b
4 changed files with 38 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2006-06-19 Richard Guenther <rguenther@suse.de>
PR middle-end/28045
* fold-const.c (operand_equal_p): Check if the argument types
have the same precision before stripping NOPs.
2006-06-19 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/27341

View File

@ -2497,6 +2497,11 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
return 0;
/* If both types don't have the same precision, then it is not safe
to strip NOPs. */
if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
return 0;
STRIP_NOPS (arg0);
STRIP_NOPS (arg1);

View File

@ -1,3 +1,8 @@
2006-06-19 Richard Guenther <rguenther@suse.de>
PR middle-end/28045
* gcc.dg/torture/pr28045.c: New testcase.
2006-06-18 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR fortran/26801

View File

@ -0,0 +1,22 @@
/* { dg-do run } */
extern void abort(void);
struct a
{
unsigned int bits : 1;
signed long val : ((sizeof(long) * 8) - 1);
};
int Fnegate (struct a b)
{
if ((-((long)b.val)) <= ((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))
&& (-((long)b.val)) >= (-(((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))) - 1))
return 0 ;
abort ();
}
int main ()
{
struct a b = {1, 1};
Fnegate (b);
return 0;
}