+2005-05-17 Zdenek Dvorak <dvorakz@suse.cz>
+
+ * tree-ssa-loop-ivopts.c (find_bivs, find_givs_in_stmt_scev): Apply
+ expand_simple_operations to bases of the ivs.
+ (tree_int_cst_sign_bit): Export.
+ * tree-flow.h (expand_simple_operations): Declare.
+ * tree-ssa-loop-niter.c (number_of_iterations_cond): Use
+ tree_int_cst_sign_bit.
+ (expand_simple_operations): Export.
+ * tree.h (tree_int_cst_sign_bit): Declare.
+
2005-05-17 Zdenek Dvorak <dvorakz@suse.cz>
* tree-cfg.c (tree_can_merge_blocks_p): Allow phi nodes in the
unsigned int *, int);
struct loop *tree_ssa_loop_version (struct loops *, struct loop *, tree,
basic_block *);
+tree expand_simple_operations (tree);
/* In tree-ssa-loop-im.c */
/* The possibilities of statement movement. */
continue;
base = PHI_ARG_DEF_FROM_EDGE (phi, loop_preheader_edge (loop));
+ base = expand_simple_operations (base);
if (contains_abnormal_ssa_name_p (base)
|| contains_abnormal_ssa_name_p (step))
continue;
if (!simple_iv (loop, stmt, TREE_OPERAND (stmt, 1), base, step, true))
return false;
+ *base = expand_simple_operations (*base);
if (contains_abnormal_ssa_name_p (*base)
|| contains_abnormal_ssa_name_p (*step))
/* Return the most significant (sign) bit of T. Similar to tree_int_cst_msb,
but the bit is determined from TYPE_PRECISION, not MODE_BITSIZE. */
-static int
+int
tree_int_cst_sign_bit (tree t)
{
unsigned bitno = TYPE_PRECISION (TREE_TYPE (t)) - 1;
/* Ignore loops of while (i-- < 10) type. */
if (code != NE_EXPR)
{
- if (step0 && !tree_expr_nonnegative_p (step0))
+ if (step0 && tree_int_cst_sign_bit (step0))
return;
- if (!zero_p (step1) && tree_expr_nonnegative_p (step1))
+ if (!zero_p (step1) && !tree_int_cst_sign_bit (step1))
return;
}
if (!zero_p (step1))
step0 = fold_unary_to_constant (NEGATE_EXPR, type, step1);
step1 = NULL_TREE;
- if (!tree_expr_nonnegative_p (fold_convert (signed_niter_type, step0)))
+ if (tree_int_cst_sign_bit (fold_convert (signed_niter_type, step0)))
{
step0 = fold_unary_to_constant (NEGATE_EXPR, type, step0);
base1 = fold_build1 (NEGATE_EXPR, type, base1);
/* Expand definitions of ssa names in EXPR as long as they are simple
enough, and return the new expression. */
-static tree
+tree
expand_simple_operations (tree expr)
{
unsigned i, n;
extern HOST_WIDE_INT tree_low_cst (tree, int);
extern int tree_int_cst_msb (tree);
extern int tree_int_cst_sgn (tree);
+extern int tree_int_cst_sign_bit (tree);
extern int tree_expr_nonnegative_p (tree);
extern bool may_negate_without_overflow_p (tree);
extern tree get_inner_array_type (tree);