re PR tree-optimization/69376 (wrong code at -Os and above on x86_64-linux-gnu)

2016-01-25  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/69376
	* tree-ssa-sccvn.h (struct vn_ssa_aux): Add range_info_anti_range_p
	flag.
	(VN_INFO_ANTI_RANGE_P): New inline.
	(VN_INFO_RANGE_TYPE): Likewise.
	* tree-ssa-sccvn.c (set_ssa_val_to): Also record and copy
	SSA_NAME_ANTI_RANGE_P.
	(free_scc_vn): Restore SSA_NAME_ANTI_RANGE_P.
	* tree-ssa-pre.c (eliminate_dom_walker::before_dom_children):
	Properly query VN_INFO_RANGE_TYPE.

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

From-SVN: r232786
This commit is contained in:
Richard Biener 2016-01-25 09:05:47 +00:00 committed by Richard Biener
parent 7ff1503c73
commit fa4511c2f4
6 changed files with 101 additions and 4 deletions

View File

@ -1,3 +1,16 @@
2016-01-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/69376
* tree-ssa-sccvn.h (struct vn_ssa_aux): Add range_info_anti_range_p
flag.
(VN_INFO_ANTI_RANGE_P): New inline.
(VN_INFO_RANGE_TYPE): Likewise.
* tree-ssa-sccvn.c (set_ssa_val_to): Also record and copy
SSA_NAME_ANTI_RANGE_P.
(free_scc_vn): Restore SSA_NAME_ANTI_RANGE_P.
* tree-ssa-pre.c (eliminate_dom_walker::before_dom_children):
Properly query VN_INFO_RANGE_TYPE.
2016-01-25 Nick Clifton <nickc@redhat.com>
PR target/66655

View File

@ -1,3 +1,8 @@
2016-01-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/69376
* gcc.dg/torture/pr69376.c: New testcase.
2016-01-24 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/69397

View File

@ -0,0 +1,45 @@
/* { dg-do run } */
/* { dg-require-effective-target int32plus } */
int printf (const char *, ...);
unsigned a, c, *d, f;
char b, e;
short g;
void
fn1 ()
{
unsigned h = 4294967290;
if (b >= 0)
{
h = b;
c = b / 290;
f = ~(c - (8 || h));
if (f)
printf ("%d\n", 1);
if (f)
printf ("%d\n", f);
g = ~f;
if (c < 3)
{
int i = -h < ~c;
unsigned j;
if (i)
j = h;
h = -j * g;
}
c = h;
}
unsigned k = ~h;
char l = e || g;
if (l < 1 || k < 7)
*d = a;
}
int
main ()
{
fn1 ();
return 0;
}

View File

@ -4047,7 +4047,7 @@ eliminate_dom_walker::before_dom_children (basic_block b)
&& ! VN_INFO_RANGE_INFO (sprime)
&& b == sprime_b)
duplicate_ssa_name_range_info (sprime,
SSA_NAME_RANGE_TYPE (lhs),
VN_INFO_RANGE_TYPE (lhs),
VN_INFO_RANGE_INFO (lhs));
}

View File

@ -3139,15 +3139,24 @@ set_ssa_val_to (tree from, tree to)
{
/* Save old info. */
if (! VN_INFO (to)->info.range_info)
VN_INFO (to)->info.range_info = SSA_NAME_RANGE_INFO (to);
{
VN_INFO (to)->info.range_info = SSA_NAME_RANGE_INFO (to);
VN_INFO (to)->range_info_anti_range_p
= SSA_NAME_ANTI_RANGE_P (to);
}
/* Use that from the dominator. */
SSA_NAME_RANGE_INFO (to) = SSA_NAME_RANGE_INFO (from);
SSA_NAME_ANTI_RANGE_P (to) = SSA_NAME_ANTI_RANGE_P (from);
}
else
{
/* Save old info. */
if (! VN_INFO (to)->info.range_info)
VN_INFO (to)->info.range_info = SSA_NAME_RANGE_INFO (to);
{
VN_INFO (to)->info.range_info = SSA_NAME_RANGE_INFO (to);
VN_INFO (to)->range_info_anti_range_p
= SSA_NAME_ANTI_RANGE_P (to);
}
/* Rather than allocating memory and unioning the info
just clear it. */
SSA_NAME_RANGE_INFO (to) = NULL;
@ -4313,7 +4322,11 @@ free_scc_vn (void)
SSA_NAME_PTR_INFO (name) = VN_INFO (name)->info.ptr_info;
else if (INTEGRAL_TYPE_P (TREE_TYPE (name))
&& VN_INFO (name)->info.range_info)
SSA_NAME_RANGE_INFO (name) = VN_INFO (name)->info.range_info;
{
SSA_NAME_RANGE_INFO (name) = VN_INFO (name)->info.range_info;
SSA_NAME_ANTI_RANGE_P (name)
= VN_INFO (name)->range_info_anti_range_p;
}
}
}
obstack_free (&vn_ssa_aux_obstack, NULL);

View File

@ -191,6 +191,9 @@ typedef struct vn_ssa_aux
insertion of such with EXPR as definition is required before
a use can be created of it. */
unsigned needs_insertion : 1;
/* Whether range-info is anti-range. */
unsigned range_info_anti_range_p : 1;
} *vn_ssa_aux_t;
enum vn_lookup_kind { VN_NOWALK, VN_WALK, VN_WALKREWRITE };
@ -253,6 +256,24 @@ VN_INFO_RANGE_INFO (tree name)
: SSA_NAME_RANGE_INFO (name));
}
/* Whether the original range info of NAME is an anti-range. */
inline bool
VN_INFO_ANTI_RANGE_P (tree name)
{
return (VN_INFO (name)->info.range_info
? VN_INFO (name)->range_info_anti_range_p
: SSA_NAME_ANTI_RANGE_P (name));
}
/* Get at the original range info kind for NAME. */
inline value_range_type
VN_INFO_RANGE_TYPE (tree name)
{
return VN_INFO_ANTI_RANGE_P (name) ? VR_ANTI_RANGE : VR_RANGE;
}
/* Get at the original pointer info for NAME. */
inline ptr_info_def *