re PR middle-end/36172 (ice for legal code with -O3)

2008-05-08  Richard Guenther  <rguenther@suse.de>

	PR middle-end/36172
	* fold-const.c (operand_equal_p): Two objects which types
	differ in pointerness are not equal.

	* gcc.c-torture/compile/pr36172.c: New testcase.

From-SVN: r135070
This commit is contained in:
Richard Guenther 2008-05-08 08:19:16 +00:00 committed by Richard Biener
parent 81464b2cd8
commit b13e7b6cfc
4 changed files with 33 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2008-05-08 Richard Guenther <rguenther@suse.de>
PR middle-end/36172
* fold-const.c (operand_equal_p): Two objects which types
differ in pointerness are not equal.
2008-05-08 Kai Tietz <kai,tietz@onevision.com>
* calls.c (compute_argument_block_size): Add argument tree fndecl.

View File

@ -3033,8 +3033,11 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
/* If both types don't have the same signedness, then we can't consider
them equal. We must check this before the STRIP_NOPS calls
because they may change the signedness of the arguments. */
if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
because they may change the signedness of the arguments. As pointers
strictly don't have a signedness, require either two pointers or
two non-pointers as well. */
if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1))
|| POINTER_TYPE_P (TREE_TYPE (arg0)) != POINTER_TYPE_P (TREE_TYPE (arg1)))
return 0;
/* If both types don't have the same precision, then it is not safe

View File

@ -1,3 +1,8 @@
2008-05-08 Richard Guenther <rguenther@suse.de>
PR middle-end/36172
* gcc.c-torture/compile/pr36172.c: New testcase.
2008-05-08 Uros Bizjak <ubizjak@gmail.com>
PR target/35714

View File

@ -0,0 +1,17 @@
int f(float * );
unsigned long FcCharSetFreeze (int *fcs, int b)
{
int i;
int a = 0;
for (i = 0; i < *fcs; i++)
{
float *leaf = (float *)fcs;
int hash = f (leaf);
if (hash)
a = b;
if (!a)
return;
}
return (unsigned long) fcs;
}