Commit 6e682d7e by Zdenek Dvorak Committed by Zdenek Dvorak

tree-ssa-loop-niter.c (zero_p, nonzero_p): Removed.

	* tree-ssa-loop-niter.c (zero_p, nonzero_p): Removed.
	(number_of_iterations_ne, number_of_iterations_lt_to_ne,
	assert_no_overflow_lt, assert_loop_rolls_lt,
	number_of_iterations_lt, number_of_iterations_le,
	number_of_iterations_cond, tree_simplify_using_condition_1,
	number_of_iterations_exit, find_loop_niter, loop_niter_by_eval,
	implies_nonnegative_p, implies_ge_p, record_nonwrapping_iv,
	idx_infer_loop_bounds, n_of_executions_at_most, scev_probably_wraps_p):
	Do not use zero_p/nonzero_p.
	* tree-ssa-loop-manip.c (determine_exit_conditions): Ditto.
	* tree-ssa-loop-ivopts.c (niter_for_exit, determine_biv_step,
	find_interesting_uses_op, find_interesting_uses_cond,
	find_interesting_uses_address, find_interesting_uses_stmt,
	strip_offset_1, add_candidate_1, add_old_ivs_candidates,
	difference_cost, determine_use_iv_cost_condition,
	rewrite_use_compare, remove_unused_ivs): Ditto.
	* tree-ssa-address.c (tree_mem_ref_addr, create_mem_ref_raw): Ditto.
	* tree-ssa-loop-prefetch.c (idx_analyze_ref): Ditto.
	* tree-cfg.c (find_taken_edge_cond_expr): Ditto.
	* tree.h (zero_p): Declaration removed.
	(null_or_integer_zerop, nonnull_and_integer_nonzerop): New.

From-SVN: r120156
parent 54129a64
2006-12-22 Zdenek Dvorak <dvorakz@suse.cz>
* tree-ssa-loop-niter.c (zero_p, nonzero_p): Removed.
(number_of_iterations_ne, number_of_iterations_lt_to_ne,
assert_no_overflow_lt, assert_loop_rolls_lt,
number_of_iterations_lt, number_of_iterations_le,
number_of_iterations_cond, tree_simplify_using_condition_1,
number_of_iterations_exit, find_loop_niter, loop_niter_by_eval,
implies_nonnegative_p, implies_ge_p, record_nonwrapping_iv,
idx_infer_loop_bounds, n_of_executions_at_most, scev_probably_wraps_p):
Do not use zero_p/nonzero_p.
* tree-ssa-loop-manip.c (determine_exit_conditions): Ditto.
* tree-ssa-loop-ivopts.c (niter_for_exit, determine_biv_step,
find_interesting_uses_op, find_interesting_uses_cond,
find_interesting_uses_address, find_interesting_uses_stmt,
strip_offset_1, add_candidate_1, add_old_ivs_candidates,
difference_cost, determine_use_iv_cost_condition,
rewrite_use_compare, remove_unused_ivs): Ditto.
* tree-ssa-address.c (tree_mem_ref_addr, create_mem_ref_raw): Ditto.
* tree-ssa-loop-prefetch.c (idx_analyze_ref): Ditto.
* tree-cfg.c (find_taken_edge_cond_expr): Ditto.
* tree.h (zero_p): Declaration removed.
(null_or_integer_zerop, nonnull_and_integer_nonzerop): New.
2006-12-22 Manuel Lopez-Ibanez <manu@gcc.gnu.org> 2006-12-22 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR middle-end/7651 PR middle-end/7651
......
...@@ -2153,7 +2153,7 @@ find_taken_edge_cond_expr (basic_block bb, tree val) ...@@ -2153,7 +2153,7 @@ find_taken_edge_cond_expr (basic_block bb, tree val)
extract_true_false_edges_from_block (bb, &true_edge, &false_edge); extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
gcc_assert (TREE_CODE (val) == INTEGER_CST); gcc_assert (TREE_CODE (val) == INTEGER_CST);
return (zero_p (val) ? false_edge : true_edge); return (integer_zerop (val) ? false_edge : true_edge);
} }
/* Given an INTEGER_CST VAL and the entry block BB to a SWITCH_EXPR /* Given an INTEGER_CST VAL and the entry block BB to a SWITCH_EXPR
......
...@@ -281,7 +281,7 @@ tree_mem_ref_addr (tree type, tree mem_ref) ...@@ -281,7 +281,7 @@ tree_mem_ref_addr (tree type, tree mem_ref)
addr = act_elem; addr = act_elem;
} }
if (!zero_p (offset)) if (offset && !integer_zerop (offset))
{ {
act_elem = fold_convert (type, offset); act_elem = fold_convert (type, offset);
...@@ -325,7 +325,7 @@ create_mem_ref_raw (tree type, struct mem_address *addr) ...@@ -325,7 +325,7 @@ create_mem_ref_raw (tree type, struct mem_address *addr)
if (addr->step && integer_onep (addr->step)) if (addr->step && integer_onep (addr->step))
addr->step = NULL_TREE; addr->step = NULL_TREE;
if (addr->offset && zero_p (addr->offset)) if (addr->offset && integer_zerop (addr->offset))
addr->offset = NULL_TREE; addr->offset = NULL_TREE;
return build7 (TARGET_MEM_REF, type, return build7 (TARGET_MEM_REF, type,
......
...@@ -732,7 +732,7 @@ niter_for_exit (struct ivopts_data *data, edge exit) ...@@ -732,7 +732,7 @@ niter_for_exit (struct ivopts_data *data, edge exit)
overlapping life ranges for them (PR 27283). */ overlapping life ranges for them (PR 27283). */
if (number_of_iterations_exit (data->current_loop, if (number_of_iterations_exit (data->current_loop,
exit, &desc, true) exit, &desc, true)
&& zero_p (desc.may_be_zero) && integer_zerop (desc.may_be_zero)
&& !contains_abnormal_ssa_name_p (desc.niter)) && !contains_abnormal_ssa_name_p (desc.niter))
nfe_desc->niter = desc.niter; nfe_desc->niter = desc.niter;
else else
...@@ -904,7 +904,7 @@ determine_biv_step (tree phi) ...@@ -904,7 +904,7 @@ determine_biv_step (tree phi)
if (!simple_iv (loop, phi, name, &iv, true)) if (!simple_iv (loop, phi, name, &iv, true))
return NULL_TREE; return NULL_TREE;
return (zero_p (iv.step) ? NULL_TREE : iv.step); return (null_or_integer_zerop (iv.step) ? NULL_TREE : iv.step);
} }
/* Finds basic ivs. */ /* Finds basic ivs. */
...@@ -1160,7 +1160,7 @@ find_interesting_uses_op (struct ivopts_data *data, tree op) ...@@ -1160,7 +1160,7 @@ find_interesting_uses_op (struct ivopts_data *data, tree op)
return use; return use;
} }
if (zero_p (iv->step)) if (null_or_integer_zerop (iv->step))
{ {
record_invariant (data, op, true); record_invariant (data, op, true);
return NULL; return NULL;
...@@ -1224,21 +1224,23 @@ find_interesting_uses_cond (struct ivopts_data *data, tree stmt, tree *cond_p) ...@@ -1224,21 +1224,23 @@ find_interesting_uses_cond (struct ivopts_data *data, tree stmt, tree *cond_p)
(!iv0 || !iv1) (!iv0 || !iv1)
/* Eliminating condition based on two ivs would be nontrivial. /* Eliminating condition based on two ivs would be nontrivial.
??? TODO -- it is not really important to handle this case. */ ??? TODO -- it is not really important to handle this case. */
|| (!zero_p (iv0->step) && !zero_p (iv1->step))) || (!null_or_integer_zerop (iv0->step)
&& !null_or_integer_zerop (iv1->step)))
{ {
find_interesting_uses_op (data, *op0_p); find_interesting_uses_op (data, *op0_p);
find_interesting_uses_op (data, *op1_p); find_interesting_uses_op (data, *op1_p);
return; return;
} }
if (zero_p (iv0->step) && zero_p (iv1->step)) if (null_or_integer_zerop (iv0->step)
&& null_or_integer_zerop (iv1->step))
{ {
/* If both are invariants, this is a work for unswitching. */ /* If both are invariants, this is a work for unswitching. */
return; return;
} }
civ = XNEW (struct iv); civ = XNEW (struct iv);
*civ = zero_p (iv0->step) ? *iv1: *iv0; *civ = null_or_integer_zerop (iv0->step) ? *iv1: *iv0;
record_use (data, cond_p, civ, stmt, USE_COMPARE); record_use (data, cond_p, civ, stmt, USE_COMPARE);
} }
...@@ -1514,7 +1516,7 @@ find_interesting_uses_address (struct ivopts_data *data, tree stmt, tree *op_p) ...@@ -1514,7 +1516,7 @@ find_interesting_uses_address (struct ivopts_data *data, tree stmt, tree *op_p)
} }
} }
if (zero_p (step)) if (null_or_integer_zerop (step))
goto fail; goto fail;
base = tree_mem_ref_addr (type, base); base = tree_mem_ref_addr (type, base);
} }
...@@ -1524,7 +1526,7 @@ find_interesting_uses_address (struct ivopts_data *data, tree stmt, tree *op_p) ...@@ -1524,7 +1526,7 @@ find_interesting_uses_address (struct ivopts_data *data, tree stmt, tree *op_p)
ifs_ivopts_data.stmt = stmt; ifs_ivopts_data.stmt = stmt;
ifs_ivopts_data.step_p = &step; ifs_ivopts_data.step_p = &step;
if (!for_each_index (&base, idx_find_step, &ifs_ivopts_data) if (!for_each_index (&base, idx_find_step, &ifs_ivopts_data)
|| zero_p (step)) || null_or_integer_zerop (step))
goto fail; goto fail;
gcc_assert (TREE_CODE (base) != ALIGN_INDIRECT_REF); gcc_assert (TREE_CODE (base) != ALIGN_INDIRECT_REF);
...@@ -1598,7 +1600,7 @@ find_interesting_uses_stmt (struct ivopts_data *data, tree stmt) ...@@ -1598,7 +1600,7 @@ find_interesting_uses_stmt (struct ivopts_data *data, tree stmt)
iv = get_iv (data, lhs); iv = get_iv (data, lhs);
if (iv && !zero_p (iv->step)) if (iv && !null_or_integer_zerop (iv->step))
return; return;
} }
...@@ -1644,7 +1646,7 @@ find_interesting_uses_stmt (struct ivopts_data *data, tree stmt) ...@@ -1644,7 +1646,7 @@ find_interesting_uses_stmt (struct ivopts_data *data, tree stmt)
lhs = PHI_RESULT (stmt); lhs = PHI_RESULT (stmt);
iv = get_iv (data, lhs); iv = get_iv (data, lhs);
if (iv && !zero_p (iv->step)) if (iv && !null_or_integer_zerop (iv->step))
return; return;
} }
...@@ -1758,7 +1760,7 @@ strip_offset_1 (tree expr, bool inside_addr, bool top_compref, ...@@ -1758,7 +1760,7 @@ strip_offset_1 (tree expr, bool inside_addr, bool top_compref,
{ {
case INTEGER_CST: case INTEGER_CST:
if (!cst_and_fits_in_hwi (expr) if (!cst_and_fits_in_hwi (expr)
|| zero_p (expr)) || integer_zerop (expr))
return orig_expr; return orig_expr;
*offset = int_cst_value (expr); *offset = int_cst_value (expr);
...@@ -1777,9 +1779,9 @@ strip_offset_1 (tree expr, bool inside_addr, bool top_compref, ...@@ -1777,9 +1779,9 @@ strip_offset_1 (tree expr, bool inside_addr, bool top_compref,
&& op1 == TREE_OPERAND (expr, 1)) && op1 == TREE_OPERAND (expr, 1))
return orig_expr; return orig_expr;
if (zero_p (op1)) if (integer_zerop (op1))
expr = op0; expr = op0;
else if (zero_p (op0)) else if (integer_zerop (op0))
{ {
if (code == PLUS_EXPR) if (code == PLUS_EXPR)
expr = op1; expr = op1;
...@@ -1805,7 +1807,7 @@ strip_offset_1 (tree expr, bool inside_addr, bool top_compref, ...@@ -1805,7 +1807,7 @@ strip_offset_1 (tree expr, bool inside_addr, bool top_compref,
*offset = off1 * st; *offset = off1 * st;
if (top_compref if (top_compref
&& zero_p (op1)) && integer_zerop (op1))
{ {
/* Strip the component reference completely. */ /* Strip the component reference completely. */
op0 = TREE_OPERAND (expr, 0); op0 = TREE_OPERAND (expr, 0);
...@@ -1971,9 +1973,9 @@ add_candidate_1 (struct ivopts_data *data, ...@@ -1971,9 +1973,9 @@ add_candidate_1 (struct ivopts_data *data,
if (!operand_equal_p (base, cand->iv->base, 0)) if (!operand_equal_p (base, cand->iv->base, 0))
continue; continue;
if (zero_p (cand->iv->step)) if (null_or_integer_zerop (cand->iv->step))
{ {
if (zero_p (step)) if (null_or_integer_zerop (step))
break; break;
} }
else else
...@@ -2134,7 +2136,7 @@ add_old_ivs_candidates (struct ivopts_data *data) ...@@ -2134,7 +2136,7 @@ add_old_ivs_candidates (struct ivopts_data *data)
EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, i, bi)
{ {
iv = ver_info (data, i)->iv; iv = ver_info (data, i)->iv;
if (iv && iv->biv_p && !zero_p (iv->step)) if (iv && iv->biv_p && !null_or_integer_zerop (iv->step))
add_old_iv_candidates (data, iv); add_old_iv_candidates (data, iv);
} }
} }
...@@ -3340,10 +3342,10 @@ difference_cost (struct ivopts_data *data, ...@@ -3340,10 +3342,10 @@ difference_cost (struct ivopts_data *data,
return 0; return 0;
} }
*var_present = true; *var_present = true;
if (zero_p (e2)) if (integer_zerop (e2))
return force_var_cost (data, e1, depends_on); return force_var_cost (data, e1, depends_on);
if (zero_p (e1)) if (integer_zerop (e1))
{ {
cost = force_var_cost (data, e2, depends_on); cost = force_var_cost (data, e2, depends_on);
cost += multiply_by_cost (-1, mode); cost += multiply_by_cost (-1, mode);
...@@ -3730,7 +3732,8 @@ determine_use_iv_cost_condition (struct ivopts_data *data, ...@@ -3730,7 +3732,8 @@ determine_use_iv_cost_condition (struct ivopts_data *data,
if (TREE_CODE (cond) != SSA_NAME) if (TREE_CODE (cond) != SSA_NAME)
{ {
op = TREE_OPERAND (cond, 0); op = TREE_OPERAND (cond, 0);
if (TREE_CODE (op) == SSA_NAME && !zero_p (get_iv (data, op)->step)) if (TREE_CODE (op) == SSA_NAME
&& !null_or_integer_zerop (get_iv (data, op)->step))
op = TREE_OPERAND (cond, 1); op = TREE_OPERAND (cond, 1);
if (TREE_CODE (op) == SSA_NAME) if (TREE_CODE (op) == SSA_NAME)
{ {
...@@ -5148,7 +5151,7 @@ rewrite_use_compare (struct ivopts_data *data, ...@@ -5148,7 +5151,7 @@ rewrite_use_compare (struct ivopts_data *data,
cond = *use->op_p; cond = *use->op_p;
op_p = &TREE_OPERAND (cond, 0); op_p = &TREE_OPERAND (cond, 0);
if (TREE_CODE (*op_p) != SSA_NAME if (TREE_CODE (*op_p) != SSA_NAME
|| zero_p (get_iv (data, *op_p)->step)) || null_or_integer_zerop (get_iv (data, *op_p)->step))
op_p = &TREE_OPERAND (cond, 1); op_p = &TREE_OPERAND (cond, 1);
op = force_gimple_operand (comp, &stmts, true, SSA_NAME_VAR (*op_p)); op = force_gimple_operand (comp, &stmts, true, SSA_NAME_VAR (*op_p));
...@@ -5219,7 +5222,7 @@ remove_unused_ivs (struct ivopts_data *data) ...@@ -5219,7 +5222,7 @@ remove_unused_ivs (struct ivopts_data *data)
info = ver_info (data, j); info = ver_info (data, j);
if (info->iv if (info->iv
&& !zero_p (info->iv->step) && !null_or_integer_zerop (info->iv->step)
&& !info->inv_id && !info->inv_id
&& !info->iv->have_use_for && !info->iv->have_use_for
&& !info->preserve_biv) && !info->preserve_biv)
......
...@@ -706,7 +706,7 @@ determine_exit_conditions (struct loop *loop, struct tree_niter_desc *desc, ...@@ -706,7 +706,7 @@ determine_exit_conditions (struct loop *loop, struct tree_niter_desc *desc,
of the loop, i.e., BOUND - step * FACTOR does not overflow. of the loop, i.e., BOUND - step * FACTOR does not overflow.
3) # of iterations is at least FACTOR */ 3) # of iterations is at least FACTOR */
if (!zero_p (desc->may_be_zero)) if (!integer_zerop (desc->may_be_zero))
cond = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, cond = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
invert_truthvalue (desc->may_be_zero), invert_truthvalue (desc->may_be_zero),
cond); cond);
......
...@@ -337,7 +337,7 @@ idx_analyze_ref (tree base, tree *index, void *data) ...@@ -337,7 +337,7 @@ idx_analyze_ref (tree base, tree *index, void *data)
ibase = iv.base; ibase = iv.base;
step = iv.step; step = iv.step;
if (zero_p (step)) if (null_or_integer_zerop (step))
istep = 0; istep = 0;
else else
{ {
......
...@@ -4075,7 +4075,22 @@ extern int integer_pow2p (tree); ...@@ -4075,7 +4075,22 @@ extern int integer_pow2p (tree);
extern int integer_nonzerop (tree); extern int integer_nonzerop (tree);
extern bool zero_p (tree); /* Returns true if X is either NULL or zero. */
static inline bool
null_or_integer_zerop (tree x)
{
return x == NULL_TREE || integer_zerop (x);
}
/* Returns true if X is non-NULL and non-zero. */
static inline bool
nonnull_and_integer_nonzerop (tree x)
{
return x != NULL_TREE && integer_nonzerop (x);
}
extern bool cst_and_fits_in_hwi (tree); extern bool cst_and_fits_in_hwi (tree);
extern tree num_ending_zeros (tree); extern tree num_ending_zeros (tree);
......
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