diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2014-02-06 08:39:24 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2014-02-06 07:39:24 +0000 |
commit | 78b1469d8b3a2262c3ddc675203f1ffebe84fbd9 (patch) | |
tree | 2a6213d1768395162d549755d0b642ed0b849621 /gcc/ipa-inline-analysis.c | |
parent | d24d2cef4f3d90972d22e0812732d21fdd7f87fc (diff) | |
download | gcc-78b1469d8b3a2262c3ddc675203f1ffebe84fbd9.zip gcc-78b1469d8b3a2262c3ddc675203f1ffebe84fbd9.tar.gz gcc-78b1469d8b3a2262c3ddc675203f1ffebe84fbd9.tar.bz2 |
re PR middle-end/60013 (Build of 176.gcc from CPU2000 loops in cc1 starting with r207231)
PR middle-end/60013
* ipa-inline-analysis.c (compute_bb_predicates): Ensure monotonicity
of the dataflow.
* gcc.dg/pr60013.c: New testcase.
Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r207529
Diffstat (limited to 'gcc/ipa-inline-analysis.c')
-rw-r--r-- | gcc/ipa-inline-analysis.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index ffb8264..6cd5dc1 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -310,7 +310,7 @@ add_clause (conditions conditions, struct predicate *p, clause_t clause) if (false_predicate_p (p)) return; - /* No one should be sily enough to add false into nontrivial clauses. */ + /* No one should be silly enough to add false into nontrivial clauses. */ gcc_checking_assert (!(clause & (1 << predicate_false_condition))); /* Look where to insert the clause. At the same time prune out @@ -1035,7 +1035,7 @@ inline_node_removal_hook (struct cgraph_node *node, memset (info, 0, sizeof (inline_summary_t)); } -/* Remap predicate P of former function to be predicate of duplicated functoin. +/* Remap predicate P of former function to be predicate of duplicated function. POSSIBLE_TRUTHS is clause of possible truths in the duplicated node, INFO is inline summary of the duplicated node. */ @@ -1887,8 +1887,15 @@ compute_bb_predicates (struct cgraph_node *node, } else if (!predicates_equal_p (&p, (struct predicate *) bb->aux)) { - done = false; - *((struct predicate *) bb->aux) = p; + /* This OR operation is needed to ensure monotonous data flow + in the case we hit the limit on number of clauses and the + and/or operations above give approximate answers. */ + p = or_predicates (summary->conds, &p, (struct predicate *)bb->aux); + if (!predicates_equal_p (&p, (struct predicate *) bb->aux)) + { + done = false; + *((struct predicate *) bb->aux) = p; + } } } } |