Commit 89a79e96 by Richard Biener Committed by Richard Biener

gimple-fold.c (has_use_on_stmt): New function.

2015-07-29  Richard Biener  <rguenther@suse.de>

	* gimple-fold.c (has_use_on_stmt): New function.
	(replace_stmt_with_simplification): Use it to allow
	abnormals originally referenced in the stmt.
	(fold_stmt_1): Canonicalize operand order.

From-SVN: r226339
parent 97d8f801
2015-07-29 Richard Biener <rguenther@suse.de>
* gimple-fold.c (has_use_on_stmt): New function.
(replace_stmt_with_simplification): Use it to allow
abnormals originally referenced in the stmt.
(fold_stmt_1): Canonicalize operand order.
2015-07-28 David Sherwood <david.sherwood@arm.com> 2015-07-28 David Sherwood <david.sherwood@arm.com>
* config/arm/arm.c (neon_element_bits, neon_valid_immediate): Call * config/arm/arm.c (neon_element_bits, neon_valid_immediate): Call
......
...@@ -3307,6 +3307,19 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace) ...@@ -3307,6 +3307,19 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
} }
/* Return true whether NAME has a use on STMT. */
static bool
has_use_on_stmt (tree name, gimple stmt)
{
imm_use_iterator iter;
use_operand_p use_p;
FOR_EACH_IMM_USE_FAST (use_p, iter, name)
if (USE_STMT (use_p) == stmt)
return true;
return false;
}
/* Worker for fold_stmt_1 dispatch to pattern based folding with /* Worker for fold_stmt_1 dispatch to pattern based folding with
gimple_simplify. gimple_simplify.
...@@ -3322,15 +3335,20 @@ replace_stmt_with_simplification (gimple_stmt_iterator *gsi, ...@@ -3322,15 +3335,20 @@ replace_stmt_with_simplification (gimple_stmt_iterator *gsi,
gimple stmt = gsi_stmt (*gsi); gimple stmt = gsi_stmt (*gsi);
/* Play safe and do not allow abnormals to be mentioned in /* Play safe and do not allow abnormals to be mentioned in
newly created statements. See also maybe_push_res_to_seq. */ newly created statements. See also maybe_push_res_to_seq.
As an exception allow such uses if there was a use of the
same SSA name on the old stmt. */
if ((TREE_CODE (ops[0]) == SSA_NAME if ((TREE_CODE (ops[0]) == SSA_NAME
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[0])) && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[0])
&& !has_use_on_stmt (ops[0], stmt))
|| (ops[1] || (ops[1]
&& TREE_CODE (ops[1]) == SSA_NAME && TREE_CODE (ops[1]) == SSA_NAME
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[1])) && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[1])
&& !has_use_on_stmt (ops[1], stmt))
|| (ops[2] || (ops[2]
&& TREE_CODE (ops[2]) == SSA_NAME && TREE_CODE (ops[2]) == SSA_NAME
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[2]))) && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[2])
&& !has_use_on_stmt (ops[2], stmt)))
return false; return false;
if (gcond *cond_stmt = dyn_cast <gcond *> (stmt)) if (gcond *cond_stmt = dyn_cast <gcond *> (stmt))
...@@ -3531,7 +3549,8 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree)) ...@@ -3531,7 +3549,8 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree))
after propagation. after propagation.
??? This shouldn't be done in generic folding but in the ??? This shouldn't be done in generic folding but in the
propagation helpers which also know whether an address was propagation helpers which also know whether an address was
propagated. */ propagated.
Also canonicalize operand order. */
switch (gimple_code (stmt)) switch (gimple_code (stmt))
{ {
case GIMPLE_ASSIGN: case GIMPLE_ASSIGN:
...@@ -3547,6 +3566,27 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree)) ...@@ -3547,6 +3566,27 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree))
&& maybe_canonicalize_mem_ref_addr (lhs)) && maybe_canonicalize_mem_ref_addr (lhs))
changed = true; changed = true;
} }
else
{
/* Canonicalize operand order. */
enum tree_code code = gimple_assign_rhs_code (stmt);
if (TREE_CODE_CLASS (code) == tcc_comparison
|| commutative_tree_code (code)
|| commutative_ternary_tree_code (code))
{
tree rhs1 = gimple_assign_rhs1 (stmt);
tree rhs2 = gimple_assign_rhs2 (stmt);
if (tree_swap_operands_p (rhs1, rhs2, false))
{
gimple_assign_set_rhs1 (stmt, rhs2);
gimple_assign_set_rhs2 (stmt, rhs1);
if (TREE_CODE_CLASS (code) == tcc_comparison)
gimple_assign_set_rhs_code (stmt,
swap_tree_comparison (code));
changed = true;
}
}
}
break; break;
case GIMPLE_CALL: case GIMPLE_CALL:
{ {
...@@ -3597,6 +3637,21 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree)) ...@@ -3597,6 +3637,21 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree))
changed = true; changed = true;
} }
break; break;
case GIMPLE_COND:
{
/* Canonicalize operand order. */
tree lhs = gimple_cond_lhs (stmt);
tree rhs = gimple_cond_rhs (stmt);
if (tree_swap_operands_p (lhs, rhs, false))
{
gcond *gc = as_a <gcond *> (stmt);
gimple_cond_set_lhs (gc, rhs);
gimple_cond_set_rhs (gc, lhs);
gimple_cond_set_code (gc,
swap_tree_comparison (gimple_cond_code (gc)));
changed = true;
}
}
default:; default:;
} }
......
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