From f87c904283c91ccb365e83a9fc1f7463265cdcf6 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 27 Apr 2009 01:35:27 +0200 Subject: ipa-pure-const.c (struct funct_state_d): New fields state_previously_known, looping_previously_known... * ipa-pure-const.c (struct funct_state_d): New fields state_previously_known, looping_previously_known; remove state_set_in_source. (analyze_function): Use new fields. (propagate): Avoid assumption that state_set_in_source imply nonlooping. * tree-ssa-loop-niter.c (finite_loop_p): New function. * tree-ssa-loop-ivcanon.c (empty_loop_p): Use it. * cfgloop.h (finite_loop_p): Declare. From-SVN: r146821 --- gcc/ipa-pure-const.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'gcc/ipa-pure-const.c') diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index c938b0d..9575468 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -72,7 +72,8 @@ struct funct_state_d /* See above. */ enum pure_const_state_e pure_const_state; /* What user set here; we can be always sure about this. */ - enum pure_const_state_e state_set_in_source; + enum pure_const_state_e state_previously_known; + bool looping_previously_known; /* True if the function could possibly infinite loop. There are a lot of ways that this could be determined. We are pretty @@ -485,7 +486,8 @@ analyze_function (struct cgraph_node *fn, bool ipa) l = XCNEW (struct funct_state_d); l->pure_const_state = IPA_CONST; - l->state_set_in_source = IPA_NEITHER; + l->state_previously_known = IPA_NEITHER; + l->looping_previously_known = true; l->looping = false; l->can_throw = false; @@ -528,17 +530,17 @@ end: if (TREE_READONLY (decl)) { l->pure_const_state = IPA_CONST; - l->state_set_in_source = IPA_CONST; + l->state_previously_known = IPA_CONST; if (!DECL_LOOPING_CONST_OR_PURE_P (decl)) - l->looping = false; + l->looping = false, l->looping_previously_known = false; } if (DECL_PURE_P (decl)) { if (l->pure_const_state != IPA_CONST) l->pure_const_state = IPA_PURE; - l->state_set_in_source = IPA_PURE; + l->state_previously_known = IPA_PURE; if (!DECL_LOOPING_CONST_OR_PURE_P (decl)) - l->looping = false; + l->looping = false, l->looping_previously_known = false; } if (TREE_NOTHROW (decl)) l->can_throw = false; @@ -728,12 +730,11 @@ propagate (void) enum pure_const_state_e this_state = pure_const_state; bool this_looping = looping; - if (w_l->state_set_in_source != IPA_NEITHER) - { - if (this_state > w_l->state_set_in_source) - this_state = w_l->state_set_in_source; - this_looping = false; - } + if (w_l->state_previously_known != IPA_NEITHER + && this_state > w_l->state_previously_known) + this_state = w_l->state_previously_known; + if (!w_l->looping_previously_known) + this_looping = false; /* All nodes within a cycle share the same info. */ w_l->pure_const_state = this_state; -- cgit v1.1