> From: Sergei Trofimovich <siarh...@google.com> > > r14-3459-g0c78240fd7d519 "Check that passes do not forget to define profile" > exposed check failures in cases when gcc produces uninitialized profile > probabilities. In case of PR/111559 uninitialized profile is generated > by edges executed 0 times reported by IPA profile: > > $ gcc -O2 -fprofile-generate pr111559.c -o b -fopt-info > $ ./b > $ gcc -O2 -fprofile-use -fprofile-correction pr111559.c -o b -fopt-info > > pr111559.c: In function 'rule1': > pr111559.c:6:13: error: probability of edge 3->4 not initialized > 6 | static void rule1(void) { if (p) edge(); } > | ^~~~~ > during GIMPLE pass: fixup_cfg > pr111559.c:6:13: internal compiler error: verify_flow_info failed > > The change conservatively ignores updates with uninitialized values and > uses initially assigned probabilities (`always` probability in case of > the example). > > PR ipa/111283 > PR gcov-profile/111559 > > gcc/ > * ipa-utils.cc (ipa_merge_profiles): Avoid producing > uninitialized probabilities when merging counters with zero > denominators. > > gcc/testsuite/ > * gcc.dg/tree-prof/pr111559.c: New test. > --- > gcc/ipa-utils.cc | 6 +++++- > gcc/testsuite/gcc.dg/tree-prof/pr111559.c | 16 ++++++++++++++++ > 2 files changed, 21 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-prof/pr111559.c > > diff --git a/gcc/ipa-utils.cc b/gcc/ipa-utils.cc > index 956c6294fd7..7c53ae9dd45 100644 > --- a/gcc/ipa-utils.cc > +++ b/gcc/ipa-utils.cc > @@ -651,13 +651,17 @@ ipa_merge_profiles (struct cgraph_node *dst, > { > edge srce = EDGE_SUCC (srcbb, i); > edge dste = EDGE_SUCC (dstbb, i); > - dste->probability = > + profile_probability merged = > dste->probability * dstbb->count.ipa ().probability_in > (dstbb->count.ipa () > + srccount.ipa ()) > + srce->probability * srcbb->count.ipa ().probability_in > (dstbb->count.ipa () > + srccount.ipa ()); > + /* We produce uninitialized probabilities when > + denominator is zero: https://gcc.gnu.org/PR111559. */ > + if (merged.initialized_p ()) > + dste->probability = merged;
Thanks for the patch. We usually avoid the uninitialized value here by simply checking that parameter of probability_in satifies nonzero_p. So I think it would be more consistent doing it here to: profile_probability sum = dstbb->count.ipa () + srccount.ipa () if (sum.nonzero_p ()) { dste->probability = ..... } OK with this change. Honza > } > dstbb->count = dstbb->count.ipa () + srccount.ipa (); > } > diff --git a/gcc/testsuite/gcc.dg/tree-prof/pr111559.c > b/gcc/testsuite/gcc.dg/tree-prof/pr111559.c > new file mode 100644 > index 00000000000..43202c6c888 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-prof/pr111559.c > @@ -0,0 +1,16 @@ > +/* { dg-options "-O2" } */ > + > +__attribute__((noipa)) static void edge(void) {} > + > +int p = 0; > + > +__attribute__((noinline)) > +static void rule1(void) { if (p) edge(); } > + > +__attribute__((noinline)) > +static void rule1_same(void) { if (p) edge(); } > + > +__attribute__((noipa)) int main(void) { > + rule1(); > + rule1_same(); > +} > -- > 2.42.0 >