http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60013
--- Comment #15 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Untested patch to turn things into true predicate when running out of space is:
--- gcc/ipa-inline-analysis.c.jj 2014-02-03 08:53:12.000000000 +0100
+++ gcc/ipa-inline-analysis.c 2014-02-05 08:01:57.093878954 +0100
@@ -310,7 +310,7 @@ add_clause (conditions conditions, struc
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
@@ -372,9 +372,13 @@ add_clause (conditions conditions, struc
}
- /* We run out of variants. Be conservative in positive direction. */
+ /* We run out of variants. Conservatively turn clause into true
+ predicate. */
if (i2 == MAX_CLAUSES)
- return;
+ {
+ p->clause[0] = 0;
+ return;
+ }
/* Keep clauses in decreasing order. This makes equivalence testing easy.
*/
p->clause[i2 + 1] = 0;
if (insert_here >= 0)
@@ -412,6 +416,8 @@ and_predicates (conditions conditions,
{
gcc_checking_assert (i < MAX_CLAUSES);
add_clause (conditions, &out, p2->clause[i]);
+ if (true_predicate_p (&out))
+ break;
}
return out;
}
@@ -459,6 +465,8 @@ or_predicates (conditions conditions,
{
gcc_checking_assert (i < MAX_CLAUSES && j < MAX_CLAUSES);
add_clause (conditions, &out, p->clause[i] | p2->clause[j]);
+ if (true_predicate_p (&out))
+ return out;
}
return out;
}
@@ -1035,7 +1043,7 @@ inline_node_removal_hook (struct cgraph_
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. */
and fixes the testcase. Yet another possibility would be to keep
add_clause/{and,or}_predicates as is and just add comment that the oscillation
is possible due to using only a subset of the predicates, and during
compute_bb_predicates just wait until all basic blocks have bb->aux set, then
do a couple of iterations of the main loop after that and finally either just
terminate, or change the oscillating bb's into true predicate.