From: Jan Hubicka Date: Mon, 31 Jul 2017 11:16:00 +0000 (+0200) Subject: Recover GOTO predictor. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7fef86d3486c9f4208a111a41a2cc66b7328b6d9;p=gcc.git Recover GOTO predictor. 2017-07-31 Jan Hubicka Martin Liska * c-typeck.c (c_finish_goto_label): Build gimple predict stament. 2017-07-31 Jan Hubicka Martin Liska * predict.def: Remove old comment and adjust probability. * gimplify.c (should_warn_for_implicit_fallthrough): Ignore PREDICT statements. 2017-07-31 Jan Hubicka Martin Liska * gcc.dg/predict-15.c: New test. * gcc.dg/tree-ssa/vrp24.c: Update scanned pattern. 2017-07-31 Jan Hubicka Martin Liska * pt.c (tsubst_copy): Copy PREDICT_EXPR. * semantics.c (finish_goto_stmt): Build gimple predict stament. * constexpr.c (potential_constant_expression_1): Handle PREDICT_EXPR. Co-Authored-By: Martin Liska From-SVN: r250737 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 54e9a2e6841..58d1942c8f7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-07-31 Jan Hubicka + Martin Liska + + * predict.def: Remove old comment and adjust probability. + * gimplify.c (should_warn_for_implicit_fallthrough): Ignore + PREDICT statements. + 2017-07-31 Uros Bizjak PR target/25967 diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index ab2a4c88cee..aff4866d915 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2017-07-31 Jan Hubicka + Martin Liska + + * c-typeck.c (c_finish_goto_label): Build gimple predict + stament. + 2017-07-31 Martin Liska PR sanitize/81530 diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 7451f3249fd..71d01350186 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -9824,6 +9824,7 @@ c_finish_goto_label (location_t loc, tree label) return NULL_TREE; TREE_USED (decl) = 1; { + add_stmt (build_predict_expr (PRED_GOTO, NOT_TAKEN)); tree t = build1 (GOTO_EXPR, void_type_node, decl); SET_EXPR_LOCATION (t, loc); return add_stmt (t); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6d9ff79c974..76d1de09c4d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2017-07-31 Jan Hubicka + Martin Liska + + * pt.c (tsubst_copy): Copy PREDICT_EXPR. + * semantics.c (finish_goto_stmt): Build gimple predict + stament. + * constexpr.c (potential_constant_expression_1): Handle + PREDICT_EXPR. + 2017-07-31 Martin Liska PR sanitize/81530 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 32180a74c3f..29ba2c3dac2 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -5782,6 +5782,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, case CLEANUP_STMT: case EMPTY_CLASS_EXPR: + case PREDICT_EXPR: return false; case GOTO_EXPR: diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 173ec3f303b..ee4e6b11334 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -15105,6 +15105,8 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) return tsubst_binary_left_fold (t, args, complain, in_decl); case BINARY_RIGHT_FOLD_EXPR: return tsubst_binary_right_fold (t, args, complain, in_decl); + case PREDICT_EXPR: + return t; default: /* We shouldn't get here, but keep going if !flag_checking. */ diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 743adbc44c6..f56d00fd8f3 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -41,6 +41,7 @@ along with GCC; see the file COPYING3. If not see #include "omp-general.h" #include "convert.h" #include "gomp-constants.h" +#include "predict.h" /* There routines provide a modular interface to perform many parsing operations. They may therefore be used during actual parsing, or @@ -630,6 +631,7 @@ finish_goto_stmt (tree destination) check_goto (destination); + add_stmt (build_predict_expr (PRED_GOTO, NOT_TAKEN)); return add_stmt (build_stmt (input_location, GOTO_EXPR, destination)); } diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 80712488833..76a08c67061 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -2037,7 +2037,9 @@ should_warn_for_implicit_fallthrough (gimple_stmt_iterator *gsi_p, tree label) gsi = *gsi_p; /* Skip all immediately following labels. */ - while (!gsi_end_p (gsi) && gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL) + while (!gsi_end_p (gsi) + && (gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL + || gimple_code (gsi_stmt (gsi)) == GIMPLE_PREDICT)) gsi_next (&gsi); /* { ... something; default:; } */ diff --git a/gcc/predict.def b/gcc/predict.def index f7b2bf7738c..326c39ae4c9 100644 --- a/gcc/predict.def +++ b/gcc/predict.def @@ -132,9 +132,8 @@ DEF_PREDICTOR (PRED_RECURSIVE_CALL, "recursive call", HITRATE (75), 0) DEF_PREDICTOR (PRED_TREE_EARLY_RETURN, "early return (on trees)", HITRATE (66), 0) -/* Branch containing goto is probably not taken. - FIXME: Currently not used. */ -DEF_PREDICTOR (PRED_GOTO, "goto", HITRATE (70), 0) +/* Branch containing goto is probably not taken. */ +DEF_PREDICTOR (PRED_GOTO, "goto", HITRATE (66), 0) /* Branch ending with return constant is probably not taken. */ DEF_PREDICTOR (PRED_CONST_RETURN, "const return", HITRATE (69), 0) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 68ef6fc9365..7243fdf3372 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-07-31 Jan Hubicka + Martin Liska + + * gcc.dg/predict-15.c: New test. + * gcc.dg/tree-ssa/vrp24.c: Update scanned pattern. + 2017-07-31 Uros Bizjak PR target/25967 diff --git a/gcc/testsuite/gcc.dg/predict-15.c b/gcc/testsuite/gcc.dg/predict-15.c new file mode 100644 index 00000000000..2a8c3ea8597 --- /dev/null +++ b/gcc/testsuite/gcc.dg/predict-15.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-profile_estimate" } */ + +int main(int argc, char **argv) +{ + if (argc == 123) + goto exit; + else + { + return 0; + } + +exit: + return 1; +} + +/* { dg-final { scan-tree-dump "goto heuristics of edge" "profile_estimate"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c b/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c index 5f7e3afa2ae..17526113d4b 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c @@ -1,8 +1,7 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-profile_estimate-blocks-details" } */ +/* { dg-options "-O2 -fdump-tree-profile_estimate" } */ -void g(void); -void h(void); +int v1, v2; void f(int x, int y) { if (x) goto A; @@ -10,11 +9,11 @@ void f(int x, int y) return; A: __attribute__((cold)) - g(); + v1 = x; return; B: __attribute__((hot)) - h(); + v2 = y; return; } diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c index 853ee21bb8f..ed49e25f87a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-forwprop -fdump-tree-vrp1-details" } */ +/* { dg-options "-O2 -fno-tree-forwprop -fdump-tree-vrp1-details -fdump-tree-optimized" } */ struct rtx_def; @@ -86,10 +86,8 @@ L7: /* The first n_sets > 0 test can be simplfiied into n_sets == 1 since n_sets can only have the values [0, 1] as it's the result of a - boolean operation. + boolean operation. */ - The second n_sets > 0 test can also be simplified into n_sets == 1 - as the only way to reach the tests is when n_sets <= 1 and the only - value which satisfies both conditions is n_sets == 1. */ -/* { dg-final { scan-tree-dump-times "Simplified relational" 2 "vrp1" } } */ +/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */ +/* { dg-final { scan-tree-dump-times "if " 4 "optimized" } } */