Commit 87961d1b by Richard Biener Committed by Richard Biener

tree-ssa-sccvn.c (cond_stmts_equal_p): Compare two GIMPLE cond stmts, enhanced…

tree-ssa-sccvn.c (cond_stmts_equal_p): Compare two GIMPLE cond stmts, enhanced and split out from ...

2015-10-21  Richard Biener  <rguenther@suse.de>

	* tree-ssa-sccvn.c (cond_stmts_equal_p): Compare two GIMPLE
	cond stmts, enhanced and split out from ...
	(vn_phi_eq): ... here.

From-SVN: r229119
parent 39c97e41
2015-10-21 Richard Biener <rguenther@suse.de>
* tree-ssa-sccvn.c (cond_stmts_equal_p): Compare two GIMPLE
cond stmts, enhanced and split out from ...
(vn_phi_eq): ... here.
2015-10-21 Richard Biener <rguenther@suse.de>
PR middle-end/68031
* fold-const.c: Include tree-ssa-operands.h and tree-into-ssa.h.
(tree_ssa_name_nonnegative_warnv_p): Fold into ...
......@@ -2687,6 +2687,43 @@ vn_phi_compute_hash (vn_phi_t vp1)
}
/* Return true if COND1 and COND2 represent the same condition, set
*INVERTED_P if one needs to be inverted to make it the same as
the other. */
static bool
cond_stmts_equal_p (gcond *cond1, gcond *cond2, bool *inverted_p)
{
enum tree_code code1 = gimple_cond_code (cond1);
enum tree_code code2 = gimple_cond_code (cond2);
tree lhs1 = gimple_cond_lhs (cond1);
tree lhs2 = gimple_cond_lhs (cond2);
tree rhs1 = gimple_cond_rhs (cond1);
tree rhs2 = gimple_cond_rhs (cond2);
*inverted_p = false;
if (code1 == code2)
;
else if (code1 == swap_tree_comparison (code2))
std::swap (lhs2, rhs2);
else if (code1 == invert_tree_comparison (code2, HONOR_NANS (lhs2)))
*inverted_p = true;
else if (code1 == invert_tree_comparison
(swap_tree_comparison (code2), HONOR_NANS (lhs2)))
{
std::swap (lhs2, rhs2);
*inverted_p = true;
}
else
return false;
if (! expressions_equal_p (vn_valueize (lhs1), vn_valueize (lhs2))
|| ! expressions_equal_p (vn_valueize (rhs1), vn_valueize (rhs2)))
return false;
return true;
}
/* Compare two phi entries for equality, ignoring VN_TOP arguments. */
static int
......@@ -2735,13 +2772,9 @@ vn_phi_eq (const_vn_phi_t const vp1, const_vn_phi_t const vp2)
if (gimple_code (last1) != GIMPLE_COND
|| gimple_code (last2) != GIMPLE_COND)
return false;
gcond *cond1 = as_a <gcond *> (last1);
gcond *cond2 = as_a <gcond *> (last2);
if (gimple_cond_code (cond1) != gimple_cond_code (cond2)
|| ! expressions_equal_p (gimple_cond_lhs (cond1),
gimple_cond_lhs (cond2))
|| ! expressions_equal_p (gimple_cond_rhs (cond1),
gimple_cond_rhs (cond2)))
bool inverted_p;
if (! cond_stmts_equal_p (as_a <gcond *> (last1),
as_a <gcond *> (last2), &inverted_p))
return false;
/* Get at true/false controlled edges into the PHI. */
......@@ -2752,6 +2785,11 @@ vn_phi_eq (const_vn_phi_t const vp1, const_vn_phi_t const vp2)
&te2, &fe2))
return false;
/* Swap edges if the second condition is the inverted of the
first. */
if (inverted_p)
std::swap (te2, fe2);
/* ??? Handle VN_TOP specially. */
if (! expressions_equal_p (vp1->phiargs[te1->dest_idx],
vp2->phiargs[te2->dest_idx])
......
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