re PR middle-end/45017 (miscompile with bitfield and optimization)

2010-07-22  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/45017
	* tree-ssa-sccvn.c (vn_reference_eq): Make sure we honor
	TYPE_PRECISION of integral types in addition to size.

	* gcc.c-torture/execute/pr45017.c: New testcase.

From-SVN: r162411
This commit is contained in:
Richard Guenther 2010-07-22 12:14:27 +00:00 committed by Richard Biener
parent e1d818f7ea
commit 5ccbfc1fb8
4 changed files with 48 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2010-07-22 Richard Guenther <rguenther@suse.de>
PR tree-optimization/45017
* tree-ssa-sccvn.c (vn_reference_eq): Make sure we honor
TYPE_PRECISION of integral types in addition to size.
2010-07-22 Maxim Kuvyrkov <maxim@codesourcery.com>
* config/rs6000/sysv4.h (CHOOSE_DYNAMIC_LINKER): Default to GLIBC

View file

@ -1,3 +1,8 @@
2010-07-22 Richard Guenther <rguenther@suse.de>
PR tree-optimization/45017
* gcc.c-torture/execute/pr45017.c: New testcase.
2010-07-22 Tobias Burnus <burnus@net-b.de>
PR fortran/45019

View file

@ -0,0 +1,22 @@
int tester(char *bytes)
{
union {
struct {
unsigned int r1:4;
unsigned int r2:4;
} fmt;
char value[1];
} ovl;
ovl.value[0] = bytes[0];
return ovl.fmt.r1;
}
extern void abort (void);
int main()
{
char buff = 0x2f;
if (tester(&buff) != 0x0f)
abort ();
return 0;
}

View file

@ -498,6 +498,21 @@ vn_reference_eq (const void *p1, const void *p2)
if (!expressions_equal_p (TYPE_SIZE (vr1->type), TYPE_SIZE (vr2->type)))
return false;
if (INTEGRAL_TYPE_P (vr1->type)
&& INTEGRAL_TYPE_P (vr2->type))
{
if (TYPE_PRECISION (vr1->type) != TYPE_PRECISION (vr2->type))
return false;
}
else if (INTEGRAL_TYPE_P (vr1->type)
&& (TYPE_PRECISION (vr1->type)
!= TREE_INT_CST_LOW (TYPE_SIZE (vr1->type))))
return false;
else if (INTEGRAL_TYPE_P (vr2->type)
&& (TYPE_PRECISION (vr2->type)
!= TREE_INT_CST_LOW (TYPE_SIZE (vr2->type))))
return false;
i = 0;
j = 0;
do