summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>2005-05-17 20:02:56 +0000
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>2005-05-17 20:02:56 +0000
commitb9845e76ea57a7d1dd2fcef8d4ca953b33ca676a (patch)
treee43ca90e30d0a349e9725b82bbd8fe83295a552e
parentbf2e0d73d7a2a35de490132cce4d81f1cdb97182 (diff)
downloadgcc-b9845e76ea57a7d1dd2fcef8d4ca953b33ca676a.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@99853 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/tree-flow.h1
-rw-r--r--gcc/tree-ssa-loop-ivopts.c4
-rw-r--r--gcc/tree-ssa-loop-niter.c8
-rw-r--r--gcc/tree.h1
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,5 +1,16 @@
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
merged block.
(replace_uses_by): New function.
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);