* 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).