public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] ipa-utils: avoid generating uninitialized probabilities on merges.
@ 2023-09-27 14:44 Sergei Trofimovich
  2023-10-01 19:29 ` [PATCH v2] ipa-utils: avoid uninitialized probabilities on ICF [PR111559] Sergei Trofimovich
  0 siblings, 1 reply; 7+ messages in thread
From: Sergei Trofimovich @ 2023-09-27 14:44 UTC (permalink / raw)
  To: gcc-patches, Jan Hubicka, Richard Biener; +Cc: Sergei Trofimovich

From: Sergei Trofimovich <siarheit@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 during profile:

    __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();
    }

    $ gcc -O2 -fprofile-generate bug.c -o b -fopt-info
    $ ./b
    $ gcc -O2 -fprofile-use -fprofile-correction bug.c -o b -fopt-info

    bug.c: In function 'rule1':
    bug.c:6:13: error: probability of edge 3->4 not initialized
        6 | static void rule1(void) { if (p) edge(); }
          |             ^~~~~
    during GIMPLE pass: fixup_cfg
    bug.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).

gcc/
	PR/111283
	PR/111559
	* ipa-utils.cc (ipa_merge_profiles): Avoid producing
	  uninitialized probabilities when merging counters with zero
	  denominators.
---
 gcc/ipa-utils.cc | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

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;
 		}
 	      dstbb->count = dstbb->count.ipa () + srccount.ipa ();
 	    }
-- 
2.42.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-10-05 13:27 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-27 14:44 [PATCH] ipa-utils: avoid generating uninitialized probabilities on merges Sergei Trofimovich
2023-10-01 19:29 ` [PATCH v2] ipa-utils: avoid uninitialized probabilities on ICF [PR111559] Sergei Trofimovich
2023-10-05 11:52   ` Jan Hubicka
2023-10-05 12:46     ` Sergei Trofimovich
2023-10-05 13:04       ` Jan Hubicka
2023-10-05 13:11         ` [PATCH v4] " Sergei Trofimovich
2023-10-05 13:27           ` Jan Hubicka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).