aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/predict.c17
-rw-r--r--gcc/profile-count.h32
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr81290.c22
-rw-r--r--gcc/tree-ssa-threadupdate.c5
6 files changed, 86 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 945708b..8d2a79a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+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.
diff --git a/gcc/predict.c b/gcc/predict.c
index 4d01bf3..2a7dbfa 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -3962,15 +3962,26 @@ force_edge_cold (edge e, bool impossible)
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;
diff --git a/gcc/profile-count.h b/gcc/profile-count.h
index e63b964..aef9da3 100644
--- a/gcc/profile-count.h
+++ b/gcc/profile-count.h
@@ -351,6 +351,22 @@ public:
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
{
@@ -767,6 +783,22 @@ public:
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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6158e37..313a939 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr81290.c b/gcc/testsuite/gcc.c-torture/compile/pr81290.c
new file mode 100644
index 0000000..1fd8b20
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr81290.c
@@ -0,0 +1,22 @@
+/* { 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;
+ }
+}
diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c
index f5bc95f..235a907 100644
--- a/gcc/tree-ssa-threadupdate.c
+++ b/gcc/tree-ssa-threadupdate.c
@@ -908,7 +908,7 @@ recompute_probabilities (basic_block bb)
/* 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
@@ -1051,7 +1051,8 @@ freqs_to_counts_path (struct redirection_data *rd)
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 ();