EVRP - Push op1 value range before pushing op0 value range.

gcc/ChangeLog:

2016-10-12  Richard Biener  <rguenther@suse.de>

	* tree-vrp.c (evrp_dom_walker::try_find_new_range): Renamed from
	try_add_new_range and made to eturn new range.
	(evrp_dom_walker::before_dom_children): Push op1 value range before
	pushing op0 value range.


gcc/testsuite/ChangeLog:

2016-10-12  Kugan Vivekanandarajah  <kuganv@linaro.org>

	* gcc.dg/tree-ssa/evrp6.c: New test.

From-SVN: r241083
parent 457e189d
2016-10-12 Richard Biener <rguenther@suse.de>
* tree-vrp.c (evrp_dom_walker::try_find_new_range): Renamed from
try_add_new_range and made to eturn new range.
(evrp_dom_walker::before_dom_children): Push op1 value range before
pushing op0 value range.
2016-10-12 Bill Schmidt <wschmidt@linux.vnet.ibm.com> 2016-10-12 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR tree-optimization/77937 PR tree-optimization/77937
......
2016-10-12 Kugan Vivekanandarajah <kuganv@linaro.org>
* gcc.dg/tree-ssa/evrp6.c: New test.
2016-10-12 Segher Boessenkool <segher@kernel.crashing.org> 2016-10-12 Segher Boessenkool <segher@kernel.crashing.org>
* gcc.target/powerpc/shrink-wrap-separate-0.c: New testcase. * gcc.target/powerpc/shrink-wrap-separate-0.c: New testcase.
......
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-evrp" } */
extern void abort (void);
int
foo (int k, int j)
{
if (j >= 10)
{
if (j < k)
{
k++;
if (k < 10)
abort ();
}
}
return j;
}
/* { dg-final { scan-tree-dump "\\\[12, \\+INF" "evrp" } } */
...@@ -10646,7 +10646,7 @@ public: ...@@ -10646,7 +10646,7 @@ public:
virtual void after_dom_children (basic_block); virtual void after_dom_children (basic_block);
void push_value_range (const_tree var, value_range *vr); void push_value_range (const_tree var, value_range *vr);
value_range *pop_value_range (const_tree var); value_range *pop_value_range (const_tree var);
void try_add_new_range (tree op, tree_code code, tree limit); value_range *try_find_new_range (tree op, tree_code code, tree limit);
/* Cond_stack holds the old VR. */ /* Cond_stack holds the old VR. */
auto_vec<std::pair <const_tree, value_range*> > stack; auto_vec<std::pair <const_tree, value_range*> > stack;
...@@ -10655,10 +10655,10 @@ public: ...@@ -10655,10 +10655,10 @@ public:
}; };
/* Add new range to OP such that (OP CODE LIMIT) is true. */ /* Find new range for OP such that (OP CODE LIMIT) is true. */
void value_range *
evrp_dom_walker::try_add_new_range (tree op, tree_code code, tree limit) evrp_dom_walker::try_find_new_range (tree op, tree_code code, tree limit)
{ {
value_range vr = VR_INITIALIZER; value_range vr = VR_INITIALIZER;
value_range *old_vr = get_value_range (op); value_range *old_vr = get_value_range (op);
...@@ -10674,8 +10674,9 @@ evrp_dom_walker::try_add_new_range (tree op, tree_code code, tree limit) ...@@ -10674,8 +10674,9 @@ evrp_dom_walker::try_add_new_range (tree op, tree_code code, tree limit)
{ {
value_range *new_vr = vrp_value_range_pool.allocate (); value_range *new_vr = vrp_value_range_pool.allocate ();
*new_vr = vr; *new_vr = vr;
push_value_range (op, new_vr); return new_vr;
} }
return NULL;
} }
/* See if there is any new scope is entered with new VR and set that VR to /* See if there is any new scope is entered with new VR and set that VR to
...@@ -10711,7 +10712,7 @@ evrp_dom_walker::before_dom_children (basic_block bb) ...@@ -10711,7 +10712,7 @@ evrp_dom_walker::before_dom_children (basic_block bb)
code = invert_tree_comparison (gimple_cond_code (stmt), code = invert_tree_comparison (gimple_cond_code (stmt),
HONOR_NANS (op0)); HONOR_NANS (op0));
/* Add VR when (OP0 CODE OP1) condition is true. */ /* Add VR when (OP0 CODE OP1) condition is true. */
try_add_new_range (op0, code, op1); value_range *op0_range = try_find_new_range (op0, code, op1);
/* Register ranges for y in x < y where /* Register ranges for y in x < y where
y might have ranges that are useful. */ y might have ranges that are useful. */
...@@ -10724,8 +10725,13 @@ evrp_dom_walker::before_dom_children (basic_block bb) ...@@ -10724,8 +10725,13 @@ evrp_dom_walker::before_dom_children (basic_block bb)
&new_code, &limit)) &new_code, &limit))
{ {
/* Add VR when (OP1 NEW_CODE LIMIT) condition is true. */ /* Add VR when (OP1 NEW_CODE LIMIT) condition is true. */
try_add_new_range (op1, new_code, limit); value_range *op1_range = try_find_new_range (op1, new_code, limit);
if (op1_range)
push_value_range (op1, op1_range);
} }
if (op0_range)
push_value_range (op0, op0_range);
} }
} }
......
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