+2017-07-02 Jan Hubicka <hubicka@ucw.cz>
+
+ PR middle-end/81290
+ * predict.c (force_edge_cold): Be more careful about propagation
+ backward.
+ * profile-count.h (profile_probability::guessed,
+ profile_probability::fdo, profile_count::guessed, profile_count::fdo):
+ New.
+ * tree-ssa-threadupdate.c (recompute_probabilities): Result is guessed.
+
2017-07-03 James Greenhalgh <james.greenhalgh@arm.com>
* doc/invoke.texi (rcpc architecture extension): Document it.
e2->count.apply_scale (count_sum2, count_sum);
e2->probability /= prob_comp;
}
- if (current_ir_type () != IR_GIMPLE)
+ if (current_ir_type () != IR_GIMPLE
+ && e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun))
update_br_prob_note (e->src);
}
/* If all edges out of e->src are unlikely, the basic block itself
is unlikely. */
else
{
- e->probability = profile_probability::always ();
- if (current_ir_type () != IR_GIMPLE)
+ if (prob_sum == profile_probability::never ())
+ e->probability = profile_probability::always ();
+ else
+ {
+ if (impossible)
+ e->probability = profile_probability::never ();
+ /* If BB has some edges out that are not impossible, we can not
+ assume that BB itself is. */
+ impossible = false;
+ }
+ if (current_ir_type () != IR_GIMPLE
+ && e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun))
update_br_prob_note (e->src);
if (e->src->count == profile_count::zero ())
return;
return profile_probability::always() - *this;
}
+ /* Return THIS with quality dropped to GUESSED. */
+ profile_probability guessed () const
+ {
+ profile_probability ret = *this;
+ ret.m_quality = profile_guessed;
+ return ret;
+ }
+
+ /* Return THIS with quality dropped to AFDO. */
+ profile_probability afdo () const
+ {
+ profile_probability ret = *this;
+ ret.m_quality = profile_afdo;
+ return ret;
+ }
+
profile_probability combine_with_freq (int freq1, profile_probability other,
int freq2) const
{
return ret;
}
+ /* Return THIS with quality dropped to GUESSED. */
+ profile_count guessed () const
+ {
+ profile_count ret = *this;
+ ret.m_quality = profile_guessed;
+ return ret;
+ }
+
+ /* Return THIS with quality dropped to AFDO. */
+ profile_count afdo () const
+ {
+ profile_count ret = *this;
+ ret.m_quality = profile_afdo;
+ return ret;
+ }
+
/* Return probability of event with counter THIS within event with counter
OVERALL. */
profile_probability probability_in (const profile_count overall) const
+2017-07-02 Jan Hubicka <hubicka@ucw.cz>
+
+ PR middle-end/81290
+ * gcc.c-torture/compile/pr81290.c: New.
+
2017-07-03 Richard Biener <rguenther@suse.de>
PR tree-optimization/60510
--- /dev/null
+/* { dg-options "-funroll-loops -w" } */
+int vz;
+
+void
+ms (int sw, int cm)
+{
+ for (vz = 0; vz < 19; ++vz)
+ {
+ fx:
+ sw *= 2;
+ }
+
+ for (;;)
+ {
+ if (sw != 0)
+ for (;;)
+ {
+ }
+ if (1 / 0 && cm != 0)
+ goto fx;
+ }
+}
/* Prevent overflow computation due to insane profiles. */
if (esucc->count < bb->count)
- esucc->probability = esucc->count.probability_in (bb->count);
+ esucc->probability = esucc->count.probability_in (bb->count).guessed ();
else
/* Can happen with missing/guessed probabilities, since we
may determine that more is flowing along duplicated
if (ein->probability.initialized_p ())
ein->count = profile_count::from_gcov_type
(apply_probability (ein->src->frequency * REG_BR_PROB_BASE,
- ein->probability.to_reg_br_prob_base ()));
+ ein->probability
+ .to_reg_br_prob_base ())).guessed ();
else
/* FIXME: this is hack; we should track uninitialized values. */
ein->count = profile_count::zero ();