diff mbox series

Calculate prediction remainder at proper place (PR tree-optimization/88650).

Message ID 282b8d02-ba94-7cb5-9260-6e3465d6e963@suse.cz
State New
Headers show
Series Calculate prediction remainder at proper place (PR tree-optimization/88650). | expand

Commit Message

Martin Liška Jan. 2, 2019, 11:14 a.m. UTC
Hi.

Following patch moves a probability calculation to a place where
it's really used. Otherwise one can end up with division by zero
that can't happen as there's no edge for which the probability
would be used.

Patch survives tests on x86_64-linux-gnu and bootstrap fine.

Ready for trunk?
Thanks,
Martin

gcc/ChangeLog:

2019-01-02  Martin Liska  <mliska@suse.cz>

	PR tree-optimization/88650
	* predict.c (set_even_probabilities): Calculate probability
	remainer only when really used.

gcc/testsuite/ChangeLog:

2019-01-02  Martin Liska  <mliska@suse.cz>

	PR tree-optimization/88650
	* gfortran.dg/predict-3.f90: New test.
---
 gcc/predict.c                           | 16 +++++++-------
 gcc/testsuite/gfortran.dg/predict-3.f90 | 28 +++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 7 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/predict-3.f90

Comments

Richard Biener Jan. 2, 2019, 1:56 p.m. UTC | #1
On Wed, Jan 2, 2019 at 12:14 PM Martin Liška <mliska@suse.cz> wrote:
>
> Hi.
>
> Following patch moves a probability calculation to a place where
> it's really used. Otherwise one can end up with division by zero
> that can't happen as there's no edge for which the probability
> would be used.
>
> Patch survives tests on x86_64-linux-gnu and bootstrap fine.
>
> Ready for trunk?
OK.

Richard.

> Thanks,
> Martin
>
> gcc/ChangeLog:
>
> 2019-01-02  Martin Liska  <mliska@suse.cz>
>
>         PR tree-optimization/88650
>         * predict.c (set_even_probabilities): Calculate probability
>         remainer only when really used.
>
> gcc/testsuite/ChangeLog:
>
> 2019-01-02  Martin Liska  <mliska@suse.cz>
>
>         PR tree-optimization/88650
>         * gfortran.dg/predict-3.f90: New test.
> ---
>  gcc/predict.c                           | 16 +++++++-------
>  gcc/testsuite/gfortran.dg/predict-3.f90 | 28 +++++++++++++++++++++++++
>  2 files changed, 37 insertions(+), 7 deletions(-)
>  create mode 100644 gcc/testsuite/gfortran.dg/predict-3.f90
>
>
diff mbox series

Patch

diff --git a/gcc/predict.c b/gcc/predict.c
index 745be185a29..0ac8adf286f 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -877,19 +877,21 @@  set_even_probabilities (basic_block bb,
 	    int p = prediction->ep_probability;
 	    profile_probability prob
 	      = profile_probability::from_reg_br_prob_base (p);
-	    profile_probability remainder = prob.invert ();
-	    remainder -= profile_probability::very_unlikely ()
-	      .apply_scale (unlikely_count, 1);
-	    int count = nedges - unlikely_count - 1;
-	    gcc_assert (count >= 0);
-	    profile_probability even = remainder.apply_scale (1, count);
 
 	    if (prediction->ep_edge == e)
 	      e->probability = prob;
 	    else if (unlikely_edges != NULL && unlikely_edges->contains (e))
 	      e->probability = profile_probability::very_unlikely ();
 	    else
-	      e->probability = even;
+	      {
+		profile_probability remainder = prob.invert ();
+		remainder -= profile_probability::very_unlikely ()
+		  .apply_scale (unlikely_count, 1);
+		int count = nedges - unlikely_count - 1;
+		gcc_assert (count >= 0);
+
+		e->probability = remainder.apply_scale (1, count);
+	      }
 	  }
 	else
 	  e->probability = profile_probability::never ();
diff --git a/gcc/testsuite/gfortran.dg/predict-3.f90 b/gcc/testsuite/gfortran.dg/predict-3.f90
new file mode 100644
index 00000000000..f5437883f9d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/predict-3.f90
@@ -0,0 +1,28 @@ 
+! { dg-do compile }
+! { dg-options "-fno-tree-fre -fno-tree-ccp -Og" }
+
+program simplify_transfer
+  call pr30881 ()
+contains
+  subroutine pr18769 ()
+    type t
+    end type t
+  end subroutine pr18769
+  subroutine pr30881 ()
+    INTEGER, PARAMETER :: K=1
+    I=TRANSFER(.TRUE.,K)
+    SELECT CASE(I)
+      CASE(TRANSFER(.TRUE.,K))
+      CASE(TRANSFER(.FALSE.,K))
+        STOP 2
+      CASE DEFAULT
+        STOP 3
+    END SELECT
+  END subroutine pr30881
+  subroutine pr31194 ()
+  end subroutine pr31194
+  subroutine pr31216 ()
+  END subroutine pr31216
+  subroutine pr31427 ()
+  END subroutine pr31427
+end program simplify_transfer