public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Fix division by zero in tree-ssa-loop-split
@ 2023-08-10 22:24 Jan Hubicka
  0 siblings, 0 replies; only message in thread
From: Jan Hubicka @ 2023-08-10 22:24 UTC (permalink / raw)
  To: gcc-patches

Hi,
Profile update I added to tree-ssa-loop-split can divide by zero in
situation that the conditional is predicted with 0 probability which
is triggered by jump threading update in the testcase.

gcc/ChangeLog:

	PR middle-end/110923
	* tree-ssa-loop-split.cc (split_loop): Watch for division by zero.

gcc/testsuite/ChangeLog:

	PR middle-end/110923
	* gcc.dg/tree-ssa/pr110923.c: New test.

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr110923.c b/gcc/testsuite/gcc.dg/tree-ssa/pr110923.c
new file mode 100644
index 00000000000..8f5720a5e9e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr110923.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */ 
+/* { dg-options "-O3 -fdump-tree-lsplit-details-blocks" } */
+int a, b, c, d;
+int main() {
+  for (a = 0; a < 2; a++) {
+    if (b > 2)
+      c = 0;
+    if (b > a)
+      d = 0;
+  }
+  return 0;
+}
+/* { dg-final { scan-tree-dump-times "loop split" 1 "lsplit" } } */
+/* { dg-final { scan-tree-dump-not "Invalid sum" "lsplit" } } */
diff --git a/gcc/tree-ssa-loop-split.cc b/gcc/tree-ssa-loop-split.cc
index 2f7918c6e65..64464802c1e 100644
--- a/gcc/tree-ssa-loop-split.cc
+++ b/gcc/tree-ssa-loop-split.cc
@@ -703,7 +703,7 @@ split_loop (class loop *loop1)
 	   split between of the two new loops.  Keep orignal estimate since
 	   it is likely better then completely dropping it.
 
-	   TODO: If we know that onle of the new loops has constant
+	   TODO: If we know that one of the new loops has constant
 	   number of iterations, we can do better.  We could also update
 	   upper bounds.  */
 	if (loop1->any_estimate
@@ -713,11 +713,15 @@ split_loop (class loop *loop1)
 			  ? true_edge->probability.to_sreal () : (sreal)1;
 	    sreal scale2 = false_edge->probability.reliable_p ()
 			  ? false_edge->probability.to_sreal () : (sreal)1;
+	    sreal div1 = loop1_prob.to_sreal ();
 	    /* +1 to get header interations rather than latch iterations and then
 	       -1 to convert back.  */
-	    loop1->nb_iterations_estimate
-	      = MAX ((((sreal)loop1->nb_iterations_estimate.to_shwi () + 1) * scale
-		     / loop1_prob.to_sreal ()).to_nearest_int () - 1, 0);
+	    if (div1 != 0)
+	      loop1->nb_iterations_estimate
+		= MAX ((((sreal)loop1->nb_iterations_estimate.to_shwi () + 1)
+		       * scale / div1).to_nearest_int () - 1, 0);
+	    else
+	      loop1->any_estimate = false;
 	    loop2->nb_iterations_estimate
 	      = MAX ((((sreal)loop2->nb_iterations_estimate.to_shwi () + 1) * scale2
 		     / profile_probability::very_likely ().to_sreal ())

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-08-10 22:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-10 22:24 Fix division by zero in tree-ssa-loop-split 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).