re PR tree-optimization/55936 (Missed VRP optimization)

2016-03-03  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/55936
	* tree-vrp.c (compare_name_with_value): Add use_equiv_p
	parameter and guard unsafe equivalence use.
	(vrp_evaluate_conditional_warnv_with_ops): Always use
	safe equivalences but not via the quadratic compare_names
	helper.

	* gcc.dg/tree-ssa/vrp06.c: Remove XFAIL.

From-SVN: r233928
This commit is contained in:
Richard Biener 2016-03-03 09:12:53 +00:00 committed by Richard Biener
parent 0a67ef4c4d
commit a75f5e30cc
4 changed files with 36 additions and 20 deletions

View file

@ -1,3 +1,12 @@
2016-03-03 Richard Biener <rguenther@suse.de>
PR tree-optimization/55936
* tree-vrp.c (compare_name_with_value): Add use_equiv_p
parameter and guard unsafe equivalence use.
(vrp_evaluate_conditional_warnv_with_ops): Always use
safe equivalences but not via the quadratic compare_names
helper.
2016-03-03 Michael Collison <michael.collison@linaro.org> 2016-03-03 Michael Collison <michael.collison@linaro.org>
PR target/70014 PR target/70014

View file

@ -1,3 +1,8 @@
2016-03-03 Richard Biener <rguenther@suse.de>
PR tree-optimization/55936
* gcc.dg/tree-ssa/vrp06.c: Remove XFAIL.
2016-03-02 Jeff Law <law@redhat.com> 2016-03-02 Jeff Law <law@redhat.com>
PR rtl-optimization/69942 PR rtl-optimization/69942

View file

@ -30,4 +30,4 @@ foo (int i, int j, int a)
/* { dg-final { scan-tree-dump-times "Folding predicate i_\[0-9\]+.*0 to 0" 1 "vrp1" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate i_\[0-9\]+.*0 to 0" 1 "vrp1" } } */
/* { dg-final { scan-tree-dump-times "Folding predicate j_\[0-9\]+.*0 to 1" 1 "vrp1" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate j_\[0-9\]+.*0 to 1" 1 "vrp1" } } */
/* { dg-final { scan-tree-dump-times "Folding predicate i_\[0-9]+.*j_\[0-9\]+.* to 0" 1 "vrp1" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "Folding predicate i_\[0-9]+.*j_\[0-9\]+.* to 0" 1 "vrp1" } } */

View file

@ -7161,7 +7161,7 @@ get_vr_for_comparison (int i)
static tree static tree
compare_name_with_value (enum tree_code comp, tree var, tree val, compare_name_with_value (enum tree_code comp, tree var, tree val,
bool *strict_overflow_p) bool *strict_overflow_p, bool use_equiv_p)
{ {
bitmap_iterator bi; bitmap_iterator bi;
unsigned i; unsigned i;
@ -7196,6 +7196,11 @@ compare_name_with_value (enum tree_code comp, tree var, tree val,
EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
{ {
if (! use_equiv_p
&& ! SSA_NAME_IS_DEFAULT_DEF (ssa_name (i))
&& prop_simulate_again_p (SSA_NAME_DEF_STMT (ssa_name (i))))
continue;
equiv_vr = get_vr_for_comparison (i); equiv_vr = get_vr_for_comparison (i);
sop = false; sop = false;
t = compare_range_with_value (comp, &equiv_vr, val, &sop); t = compare_range_with_value (comp, &equiv_vr, val, &sop);
@ -7381,24 +7386,21 @@ vrp_evaluate_conditional_warnv_with_ops (enum tree_code code, tree op0,
&& !POINTER_TYPE_P (TREE_TYPE (op0))) && !POINTER_TYPE_P (TREE_TYPE (op0)))
return NULL_TREE; return NULL_TREE;
if (use_equiv_p) if ((ret = vrp_evaluate_conditional_warnv_with_ops_using_ranges
{ (code, op0, op1, strict_overflow_p)))
if (only_ranges return ret;
&& (ret = vrp_evaluate_conditional_warnv_with_ops_using_ranges if (only_ranges)
(code, op0, op1, strict_overflow_p))) *only_ranges = false;
return ret; /* Do not use compare_names during propagation, it's quadratic. */
*only_ranges = false; if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME
if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME) && use_equiv_p)
return compare_names (code, op0, op1, strict_overflow_p); return compare_names (code, op0, op1, strict_overflow_p);
else if (TREE_CODE (op0) == SSA_NAME) else if (TREE_CODE (op0) == SSA_NAME)
return compare_name_with_value (code, op0, op1, strict_overflow_p); return compare_name_with_value (code, op0, op1,
else if (TREE_CODE (op1) == SSA_NAME) strict_overflow_p, use_equiv_p);
return (compare_name_with_value else if (TREE_CODE (op1) == SSA_NAME)
(swap_tree_comparison (code), op1, op0, strict_overflow_p)); return compare_name_with_value (swap_tree_comparison (code), op1, op0,
} strict_overflow_p, use_equiv_p);
else
return vrp_evaluate_conditional_warnv_with_ops_using_ranges (code, op0, op1,
strict_overflow_p);
return NULL_TREE; return NULL_TREE;
} }