aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2016-06-16 18:05:25 +0200
committerMartin Liska <marxin@gcc.gnu.org>2016-06-16 16:05:25 +0000
commit68fa96d6257baa572dad70a23259670be1542efb (patch)
tree4639894bc52d12b93835464e86fc462d737e390f /gcc
parent8b051d2e6c9a816aff781802b311dbdb77ac7be0 (diff)
downloadgcc-68fa96d6257baa572dad70a23259670be1542efb.zip
gcc-68fa96d6257baa572dad70a23259670be1542efb.tar.gz
gcc-68fa96d6257baa572dad70a23259670be1542efb.tar.bz2
Introduce fortran loop preheader
* 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. * trans-stmt.c (gfc_trans_simple_do): Predict the edge. * gfortran.dg/predict-1.f90: New test. From-SVN: r237533
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fortran/ChangeLog4
-rw-r--r--gcc/fortran/trans-stmt.c4
-rw-r--r--gcc/gimple-fold.c8
-rw-r--r--gcc/predict.def6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gfortran.dg/predict-1.f9012
7 files changed, 43 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 52fa674..4d6fdf6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2016-06-16 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.
+
+2016-06-16 Martin Liska <mliska@suse.cz>
+
* predict.def: Add 'Fortran' to display text of all
PRED_FORTRAN_* predictors.
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 9ba1554..7150f84 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,9 @@
2016-06-16 Martin Liska <mliska@suse.cz>
+ * trans-stmt.c (gfc_trans_simple_do): Predict the edge.
+
+2016-06-16 Martin Liska <mliska@suse.cz>
+
* trans-array.c (gfc_array_allocate): Do not generate expect
stmt.
* trans.c (gfc_allocate_using_malloc): Properly set FAIL_ALLOC
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/ChangeLog b/gcc/testsuite/ChangeLog
index eb84aeb..3dfb452 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-06-16 Martin Liska <mliska@suse.cz>
+
+ * gfortran.dg/predict-1.f90: New test.
+
2016-06-16 Uros Bizjak <ubizjak@gmail.com>
PR target/71242
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" } }