This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Introduce fortran loop preheader


Hello.

Following patch introduces FORTRAN_LOOP_PREHEADER predictor for all
Fortran loops that are transformed to:

   [Evaluate loop bounds and step]
   dovar = from;
   if ((step > 0) ? (dovar <= to) : (dovar => to))
    {
      for (;;)
        {
	  body;
   cycle_label:
	  cond = (dovar == to);
	  dovar += step;
	  if (cond) goto end_label;
	}
      }
   end_label:

The first condition can be predicted as satisfied in most situations.
I've also measured the predictor on SPEC2006 and was 99%, which I've
picked up as the hitrate. The patch is pre-approved by Honza.

Patch survives reg&bootstrap on x86_64-linux-gnu.
Installed as r237533.

Martin
>From 6072b4e4a215b876da99ebb37132852bdfd033ee Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Wed, 15 Jun 2016 14:45:12 +0200
Subject: [PATCH 2/2] Introduce fortran loop preheader

gcc/ChangeLog:

2016-06-15  Martin Liska  <mliska@suse.cz>

	* predict.def: Add fortran loop preheader predictor.
	* gimple-fold.c (gimple_fold_stmt_to_constant_1): Properly
	fold IFN_BUILTIN_EXPECT with a known constant argument.

gcc/fortran/ChangeLog:

2016-06-15  Martin Liska  <mliska@suse.cz>

	* trans-stmt.c (gfc_trans_simple_do): Predict the edge.

gcc/testsuite/ChangeLog:

2016-06-16  Martin Liska  <mliska@suse.cz>

	* gfortran.dg/predict-1.f90: New test.
---
 gcc/fortran/trans-stmt.c                |  4 +++-
 gcc/gimple-fold.c                       |  8 ++++++++
 gcc/predict.def                         |  6 ++++++
 gcc/testsuite/gfortran.dg/predict-1.f90 | 12 ++++++++++++
 4 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gfortran.dg/predict-1.f90

diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index 7d3cf8c..84bf749 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -1938,7 +1938,9 @@ gfc_trans_simple_do (gfc_code * code, stmtblock_t *pblock, tree dovar,
   else
     cond = fold_build2_loc (loc, GE_EXPR, boolean_type_node, dovar,
 			    to);
-  tmp = fold_build3_loc (loc, COND_EXPR, void_type_node, cond, tmp,
+
+  tmp = fold_build3_loc (loc, COND_EXPR, void_type_node,
+			 gfc_likely (cond, PRED_FORTRAN_LOOP_PREHEADER), tmp,
 			 build_empty_stmt (loc));
   gfc_add_expr_to_block (pblock, tmp);
 
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 885367e..fa03e89 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -5250,6 +5250,14 @@ gimple_fold_stmt_to_constant_1 (gimple *stmt, tree (*valueize) (tree),
 	      case IFN_UBSAN_CHECK_MUL:
 		subcode = MULT_EXPR;
 		break;
+	      case IFN_BUILTIN_EXPECT:
+		  {
+		    tree arg0 = gimple_call_arg (stmt, 0);
+		    tree op0 = (*valueize) (arg0);
+		    if (TREE_CODE (op0) == INTEGER_CST)
+		      return op0;
+		    return NULL_TREE;
+		  }
 	      default:
 		return NULL_TREE;
 	      }
diff --git a/gcc/predict.def b/gcc/predict.def
index 3e3a43a..a0d0ba9 100644
--- a/gcc/predict.def
+++ b/gcc/predict.def
@@ -199,3 +199,9 @@ DEF_PREDICTOR (PRED_FORTRAN_INVALID_BOUND, "Fortran invalid bound", \
    which in turn has an optional argument.  */
 DEF_PREDICTOR (PRED_FORTRAN_ABSENT_DUMMY, "Fortran absent dummy", \
 	       HITRATE (60), 0)
+
+/* Fortran DO statement generates a pre-header guard:
+   empty = (step > 0 ? to < from : to > from), which can be predicted
+   to be very likely.  */
+DEF_PREDICTOR (PRED_FORTRAN_LOOP_PREHEADER, "Fortran loop preheader", \
+	       HITRATE (99), 0)
diff --git a/gcc/testsuite/gfortran.dg/predict-1.f90 b/gcc/testsuite/gfortran.dg/predict-1.f90
new file mode 100644
index 0000000..81f0436
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/predict-1.f90
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! { dg-options "-O2 -fdump-tree-profile_estimate" }
+
+subroutine test(block, array)
+integer :: i, block(9), array(2)
+
+do i = array(1), array(2)
+    block(i) = i
+end do
+end subroutine test
+
+! { dg-final { scan-tree-dump-times "Fortran loop preheader heuristics of edge\[^:\]*: 99.0%" 1 "profile_estimate" } }
-- 
2.8.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]