From patchwork Thu Nov 24 12:59:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 83893 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp106509qgi; Thu, 24 Nov 2016 04:59:45 -0800 (PST) X-Received: by 10.99.141.193 with SMTP id z184mr4014399pgd.23.1479992385824; Thu, 24 Nov 2016 04:59:45 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id c41si10785215plj.134.2016.11.24.04.59.45 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 24 Nov 2016 04:59:45 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-442548-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-442548-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-442548-patch=linaro.org@gcc.gnu.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:to:references:cc:from:message-id:date:mime-version :in-reply-to:content-type; q=dns; s=default; b=CGML/2HGngyuvO3sg VfOJwC9679Q3raSzhF0YQJ8wJuVsHz+SX64Rlif7Hsc3thUUKqO2SA3f1ZYfN28o 6ZqCMcGaflWPqX2ednFLF7BktkyC1LgcN6FZEORdSgRgFBPri+15nAAkWA+nTUmt Zpmkwtqi7fkKFHLKSyPGRFLI7s= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:to:references:cc:from:message-id:date:mime-version :in-reply-to:content-type; s=default; bh=BC8IJdpS9T4GMy2Z6ifp+oe Yq3A=; b=vaTWONAWr+dMv43ZeZsCkQDG5yXOXaOq/2s7DDZhPNZNUDYduxyMvYS oi2wlkIz4J/Ro2xtAgCogSnsioJFS2EDg89U3EGSH8c6SSnV9i/CFElru45XzSDJ 63J5fManLcYBUIEfNpnH78uzbt/3gb7Ej7mh2jybZq2nsbSYTVWg= Received: (qmail 21841 invoked by alias); 24 Nov 2016 12:59:23 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 21825 invoked by uid 89); 24 Nov 2016 12:59:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00, SPF_PASS autolearn=ham version=3.3.2 spammy=25427, 2542, 7, 9989, 9576 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 24 Nov 2016 12:59:13 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C574CADD3; Thu, 24 Nov 2016 12:59:10 +0000 (UTC) Subject: Re: [PATCH] Dump probability for edges a frequency for BBs To: Richard Biener , Jeff Law References: <9cf2ba60-f7ef-b984-2f86-56a4d073e454@suse.cz> <5c093145-7619-7cb4-dff2-7bc3a573cfc5@redhat.com> Cc: GCC Patches , Jan Hubicka From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Message-ID: <1c516d8f-8ff5-4cf8-cbd6-9f503b5c1695@suse.cz> Date: Thu, 24 Nov 2016 13:59:03 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: X-IsSubscribed: yes On 11/24/2016 09:29 AM, Richard Biener wrote: > Please guard with ! TDF_GIMPLE, otherwise the output will not be parseable > with the GIMPLE FE. > > RIchard. Done and verified that and it provides equal dumps for -fdump*-gimple. Installed as r242837. Thanks for review. Martin >From af3fffab592e545892317b2019845f247c36d0d7 Mon Sep 17 00:00:00 2001 From: marxin Date: Wed, 9 Nov 2016 14:11:48 +0100 Subject: [PATCH] Dump probability for edges a frequency for BBs gcc/ChangeLog: 2016-11-11 Martin Liska * gimple-pretty-print.c (dump_edge_probability): New function. (dump_gimple_switch): Dump label edge probabilities. (dump_gimple_cond): Likewise. (dump_gimple_label): Dump (dump_gimple_bb_header): Dump basic block frequency. (pp_cfg_jump): Replace e->dest argument with e. (dump_implicit_edges): Likewise. * tree-ssa-loop-ivopts.c (get_scaled_computation_cost_at): Use gimple_bb (at) instead of at->bb. gcc/testsuite/ChangeLog: 2016-11-11 Martin Liska * gcc.dg/builtin-unreachable-6.c: Update test to not to scan parts for frequencies/probabilities. * gcc.dg/pr34027-1.c: Likewise. * gcc.dg/strict-overflow-2.c: Likewise. * gcc.dg/tree-ssa/20040703-1.c: Likewise. * gcc.dg/tree-ssa/builtin-sprintf-2.c: Likewise. * gcc.dg/tree-ssa/pr32044.c: Likewise. * gcc.dg/tree-ssa/vector-3.c: Likewise. * gcc.dg/tree-ssa/vrp101.c: Likewise. * gcc.dg/tree-ssa/dump-2.c: New test. --- gcc/gimple-pretty-print.c | 70 ++++++++++++++++++++--- gcc/testsuite/gcc.dg/builtin-unreachable-6.c | 2 +- gcc/testsuite/gcc.dg/pr34027-1.c | 4 +- gcc/testsuite/gcc.dg/strict-overflow-2.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/20040703-1.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-2.c | 4 +- gcc/testsuite/gcc.dg/tree-ssa/dump-2.c | 9 +++ gcc/testsuite/gcc.dg/tree-ssa/pr32044.c | 4 +- gcc/testsuite/gcc.dg/tree-ssa/vector-3.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/vrp101.c | 2 +- gcc/tree-ssa-loop-ivopts.c | 2 +- 11 files changed, 82 insertions(+), 21 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/dump-2.c diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c index 8286326..b5e866d 100644 --- a/gcc/gimple-pretty-print.c +++ b/gcc/gimple-pretty-print.c @@ -36,6 +36,7 @@ along with GCC; see the file COPYING3. If not see #include "dumpfile.h" /* for dump_flags */ #include "value-prof.h" #include "trans-mem.h" +#include "cfganal.h" #define INDENT(SPACE) \ do { int i; for (i = 0; i < SPACE; i++) pp_space (buffer); } while (0) @@ -71,6 +72,14 @@ debug_gimple_stmt (gimple *gs) print_gimple_stmt (stderr, gs, 0, TDF_VOPS|TDF_MEMSYMS); } +/* Dump E probability to BUFFER. */ + +static void +dump_edge_probability (pretty_printer *buffer, edge e) +{ + pp_scalar (buffer, " [%.1f%%]", + e->probability * 100.0 / REG_BR_PROB_BASE); +} /* Print GIMPLE statement G to FILE using SPC indentation spaces and FLAGS as in pp_gimple_stmt_1. */ @@ -905,7 +914,20 @@ dump_gimple_switch (pretty_printer *buffer, gswitch *gs, int spc, gcc_checking_assert (case_label != NULL_TREE); dump_generic_node (buffer, case_label, spc, flags, false); pp_space (buffer); - dump_generic_node (buffer, CASE_LABEL (case_label), spc, flags, false); + tree label = CASE_LABEL (case_label); + dump_generic_node (buffer, label, spc, flags, false); + + if (cfun && cfun->cfg) + { + basic_block dest = label_to_block (label); + if (dest) + { + edge label_edge = find_edge (gimple_bb (gs), dest); + if (label_edge && !(flags & TDF_GIMPLE)) + dump_edge_probability (buffer, label_edge); + } + } + if (i < gimple_switch_num_labels (gs) - 1) { if (flags & TDF_GIMPLE) @@ -943,6 +965,23 @@ dump_gimple_cond (pretty_printer *buffer, gcond *gs, int spc, int flags) dump_generic_node (buffer, gimple_cond_rhs (gs), spc, flags, false); if (!(flags & TDF_RHS_ONLY)) { + edge_iterator ei; + edge e, true_edge = NULL, false_edge = NULL; + basic_block bb = gimple_bb (gs); + + if (bb) + { + FOR_EACH_EDGE (e, ei, bb->succs) + { + if (e->flags & EDGE_TRUE_VALUE) + true_edge = e; + else if (e->flags & EDGE_FALSE_VALUE) + false_edge = e; + } + } + + bool has_edge_info = true_edge != NULL && false_edge != NULL; + pp_right_paren (buffer); if (gimple_cond_true_label (gs)) @@ -950,6 +989,8 @@ dump_gimple_cond (pretty_printer *buffer, gcond *gs, int spc, int flags) pp_string (buffer, " goto "); dump_generic_node (buffer, gimple_cond_true_label (gs), spc, flags, false); + if (has_edge_info && !(flags & TDF_GIMPLE)) + dump_edge_probability (buffer, true_edge); pp_semicolon (buffer); } if (gimple_cond_false_label (gs)) @@ -957,6 +998,9 @@ dump_gimple_cond (pretty_printer *buffer, gcond *gs, int spc, int flags) pp_string (buffer, " else goto "); dump_generic_node (buffer, gimple_cond_false_label (gs), spc, flags, false); + if (has_edge_info && !(flags & TDF_GIMPLE)) + dump_edge_probability (buffer, false_edge); + pp_semicolon (buffer); } } @@ -977,6 +1021,10 @@ dump_gimple_label (pretty_printer *buffer, glabel *gs, int spc, int flags) else { dump_generic_node (buffer, label, spc, flags, false); + basic_block bb = gimple_bb (gs); + if (bb && !(flags & TDF_GIMPLE)) + pp_scalar (buffer, " [%.1f%%]", + bb->frequency * 100.0 / REG_BR_PROB_BASE); pp_colon (buffer); } if (flags & TDF_GIMPLE) @@ -2542,7 +2590,8 @@ dump_gimple_bb_header (FILE *outf, basic_block bb, int indent, int flags) if (flags & TDF_GIMPLE) fprintf (outf, "%*sbb_%d:\n", indent, "", bb->index); else - fprintf (outf, "%*s:\n", indent, "", bb->index); + fprintf (outf, "%*s [%.1f%%]:\n", indent, "", bb->index, + bb->frequency * 100.0 / REG_BR_PROB_BASE); } } } @@ -2588,19 +2637,20 @@ dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags) to BUFFER. */ static void -pp_cfg_jump (pretty_printer *buffer, basic_block bb, int flags) +pp_cfg_jump (pretty_printer *buffer, edge e, int flags) { if (flags & TDF_GIMPLE) { pp_string (buffer, "goto bb_"); - pp_decimal_int (buffer, bb->index); + pp_decimal_int (buffer, e->dest->index); pp_semicolon (buffer); } else { - gimple *stmt = first_stmt (bb); + gimple *stmt = first_stmt (e->dest); + pp_string (buffer, "goto index); + pp_decimal_int (buffer, e->dest->index); pp_greater (buffer); if (stmt && gimple_code (stmt) == GIMPLE_LABEL) { @@ -2613,6 +2663,8 @@ pp_cfg_jump (pretty_printer *buffer, basic_block bb, int flags) } else pp_semicolon (buffer); + + dump_edge_probability (buffer, e); } } @@ -2641,11 +2693,11 @@ dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent, extract_true_false_edges_from_block (bb, &true_edge, &false_edge); INDENT (indent + 2); - pp_cfg_jump (buffer, true_edge->dest, flags); + pp_cfg_jump (buffer, true_edge, flags); newline_and_indent (buffer, indent); pp_string (buffer, "else"); newline_and_indent (buffer, indent + 2); - pp_cfg_jump (buffer, false_edge->dest, flags); + pp_cfg_jump (buffer, false_edge, flags); pp_newline (buffer); return; } @@ -2662,7 +2714,7 @@ dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent, && e->goto_locus != UNKNOWN_LOCATION) dump_location (buffer, e->goto_locus); - pp_cfg_jump (buffer, e->dest, flags); + pp_cfg_jump (buffer, e, flags); pp_newline (buffer); } } diff --git a/gcc/testsuite/gcc.dg/builtin-unreachable-6.c b/gcc/testsuite/gcc.dg/builtin-unreachable-6.c index 2f8ca36..d2596e9 100644 --- a/gcc/testsuite/gcc.dg/builtin-unreachable-6.c +++ b/gcc/testsuite/gcc.dg/builtin-unreachable-6.c @@ -16,5 +16,5 @@ lab2: goto *x; } -/* { dg-final { scan-tree-dump-times "lab:" 1 "fab1" } } */ +/* { dg-final { scan-tree-dump-times "lab \\\[\[0-9.\]+%\\\]" 1 "fab1" } } */ /* { dg-final { scan-tree-dump-times "__builtin_unreachable" 1 "fab1" } } */ diff --git a/gcc/testsuite/gcc.dg/pr34027-1.c b/gcc/testsuite/gcc.dg/pr34027-1.c index b1163ce..0405e35 100644 --- a/gcc/testsuite/gcc.dg/pr34027-1.c +++ b/gcc/testsuite/gcc.dg/pr34027-1.c @@ -11,5 +11,5 @@ unsigned long foobar(unsigned long ns) /* This test was originally introduced to test that we transform to ns % 10000. See the discussion of PR 32044 why we do not do that anymore. */ -/* { dg-final { scan-tree-dump-times "%" 0 "optimized" } } */ -/* { dg-final { scan-tree-dump-times "/" 0 "optimized" } } */ +/* { dg-final { scan-tree-dump-times " % " 0 "optimized" } } */ +/* { dg-final { scan-tree-dump-times " / " 0 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/strict-overflow-2.c b/gcc/testsuite/gcc.dg/strict-overflow-2.c index c39d8e8..f23c43a 100644 --- a/gcc/testsuite/gcc.dg/strict-overflow-2.c +++ b/gcc/testsuite/gcc.dg/strict-overflow-2.c @@ -12,4 +12,4 @@ foo (int i) return (i * 100) / 10; } -/* { dg-final { scan-tree-dump-not "100" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "\\\* 100" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20040703-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20040703-1.c index 25e470a..2980047 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/20040703-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/20040703-1.c @@ -9,4 +9,4 @@ float foo(float x) } /* We should *not* fold the arithmetic. */ -/* { dg-final { scan-tree-dump-times "0\\.0" 0 "dom2"} } */ +/* { dg-final { scan-tree-dump-times "0\\.0\[^%\]" 0 "dom2"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-2.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-2.c index 1996665..6279956 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-2.c @@ -252,5 +252,5 @@ RNG (0, 6, 8, "%s%ls", "1", L"2"); */ -/* { dg-final { scan-tree-dump-times ">:\n *__builtin_abort" 114 "optimized" { target { ilp32 || lp64 } } } } */ -/* { dg-final { scan-tree-dump-times ">:\n *__builtin_abort" 83 "optimized" { target { { ! ilp32 } && { ! lp64 } } } } } */ +/* { dg-final { scan-tree-dump-times "> \\\[\[0-9.\]+%\\\]:\n *__builtin_abort" 114 "optimized" { target { ilp32 || lp64 } } } } */ +/* { dg-final { scan-tree-dump-times "> \\\[\[0-9.\]+%\\\]:\n *__builtin_abort" 83 "optimized" { target { { ! ilp32 } && { ! lp64 } } } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dump-2.c b/gcc/testsuite/gcc.dg/tree-ssa/dump-2.c new file mode 100644 index 0000000..11cde92 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/dump-2.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized" } */ + +int f(void) +{ + return 0; +} + +/* { dg-final { scan-tree-dump " \\\[100\\\.0%\\\]:" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr32044.c b/gcc/testsuite/gcc.dg/tree-ssa/pr32044.c index 745a5e4..8a8977a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr32044.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr32044.c @@ -48,6 +48,6 @@ int baz (int n) /* There should be no division/modulo in the final dump (division and modulo by 64 are done using bit operations). */ -/* { dg-final { scan-tree-dump-times "/" 0 "optimized" } } */ -/* { dg-final { scan-tree-dump-times "%" 0 "optimized" } } */ +/* { dg-final { scan-tree-dump-times " / " 0 "optimized" } } */ +/* { dg-final { scan-tree-dump-times " % " 0 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vector-3.c b/gcc/testsuite/gcc.dg/tree-ssa/vector-3.c index ecdebf6..589ee7e 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vector-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vector-3.c @@ -14,6 +14,6 @@ float f(float b) /* We should be able to optimize this to just "return 0.0;" */ /* { dg-final { scan-tree-dump-times "BIT_FIELD_REF" 0 "optimized"} } */ -/* { dg-final { scan-tree-dump-times "0\\\.0" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump-times " 0\\\.0" 1 "optimized"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c index cfca539..bf4109f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c @@ -10,4 +10,4 @@ int main () return 0; } -/* { dg-final { scan-tree-dump ":\[\n\r \]*return 0;" "optimized" } } */ +/* { dg-final { scan-tree-dump " \\\[\[0-9.\]+%\\\]:\[\n\r \]*return 0;" "optimized" } } */ diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 2655c23..5c667a2 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -4807,7 +4807,7 @@ get_scaled_computation_cost_at (ivopts_data *data, gimple *at, iv_cand *cand, comp_cost cost) { int loop_freq = data->current_loop->header->frequency; - int bb_freq = at->bb->frequency; + int bb_freq = gimple_bb (at)->frequency; if (loop_freq != 0) { gcc_assert (cost.scratch <= cost.cost); -- 2.10.2