From d7bf3bcf99126e5d554a6121d79344a6f3c7bdf2 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Tue, 17 May 2005 22:02:56 +0200 Subject: [PATCH] tree-ssa-loop-ivopts.c (find_bivs, [...]): Apply expand_simple_operations to bases of the ivs. * 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. From-SVN: r99853 --- gcc/ChangeLog | 11 +++++++++++ gcc/tree-flow.h | 1 + gcc/tree-ssa-loop-ivopts.c | 4 +++- gcc/tree-ssa-loop-niter.c | 8 ++++---- gcc/tree.h | 1 + 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 141be32fece..45a3de5b575 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2005-05-17 Zdenek Dvorak + + * 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 * tree-cfg.c (tree_can_merge_blocks_p): Allow phi nodes in the diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 90bef3763f9..273a26ce49c 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -725,6 +725,7 @@ bool tree_duplicate_loop_to_header_edge (struct loop *, edge, struct loops *, 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. */ diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 00e7849e7f8..af121c4489d 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -992,6 +992,7 @@ find_bivs (struct ivopts_data *data) 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; @@ -1062,6 +1063,7 @@ find_givs_in_stmt_scev (struct ivopts_data *data, tree stmt, 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)) @@ -2536,7 +2538,7 @@ var_at_stmt (struct loop *loop, struct iv_cand *cand, tree stmt) /* 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; diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c index b3bde288a48..38f7b42d46c 100644 --- a/gcc/tree-ssa-loop-niter.c +++ b/gcc/tree-ssa-loop-niter.c @@ -189,10 +189,10 @@ number_of_iterations_cond (tree type, tree base0, tree step0, /* 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; } @@ -366,7 +366,7 @@ number_of_iterations_cond (tree type, tree base0, tree step0, 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); @@ -627,7 +627,7 @@ simplify_replace_tree (tree expr, tree old, tree new) /* 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; diff --git a/gcc/tree.h b/gcc/tree.h index 60b7943cf35..8dc989435bb 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -2953,6 +2953,7 @@ extern int host_integerp (tree, int); 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);