From patchwork Thu Mar 2 02:29:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xionghu Luo X-Patchwork-Id: 65878 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 69EE53858426 for ; Thu, 2 Mar 2023 02:30:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 69EE53858426 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677724245; bh=AgbS27az3gcri1OjMG24ODg90GevgRDaX8nofNrDaOI=; h=To:Cc:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=efhhxGQwwSXD/j3YuYPQhLCXddd/sRzMh3tx7DCGv2WPQtRogPfaX2dShmHyixN1m zB+tIVofsSmReJAMIk2XDjYlXoXsUQBS5X4irKXU2d75itBVNZZENUKWlWHylLu0Hd 7cQY24AzJ2B6FMlcQ53y0r714am7avLRqT8ea2yE= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from VM-122-127-centos.localdomain (unknown [43.132.141.8]) by sourceware.org (Postfix) with ESMTPS id 2A9243858D3C; Thu, 2 Mar 2023 02:30:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2A9243858D3C Received: by VM-122-127-centos.localdomain (Postfix, from userid 1009) id B01A7410DE; Thu, 2 Mar 2023 10:30:11 +0800 (CST) To: gcc-patches@gcc.gnu.org Cc: luoxhu@gcc.gnu.org, rguenther@suse.de, hubicka@ucw.cz, Xionghu Luo Subject: [PATCH 1/2] gcov: Fix "do-while" structure in case statement leads to incorrect code coverage [PR93680] Date: Thu, 2 Mar 2023 10:29:20 +0800 Message-Id: <20230302022921.4055291-1-xionghuluo@tencent.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-Spam-Status: No, score=-7.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_QUARANTINE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_SHORT, NO_DNS_FOR_FROM, RCVD_IN_PBL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Xionghu Luo via Gcc-patches From: Xionghu Luo Reply-To: Xionghu Luo Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" When spliting edge with self loop, the split edge should be placed just next to the edge_in->src, otherwise it may generate different position latch bbs for two consecutive self loops. For details, please refer to: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93680#c4 Regression tested pass on x86_64-linux-gnu and aarch64-linux-gnu, OK for master? gcc/ChangeLog: PR gcov/93680 * tree-cfg.cc (split_edge_bb_loc): Return edge_in->src for self loop. gcc/testsuite/ChangeLog: PR gcov/93680 * gcc.misc-tests/gcov-pr93680.c: New test. Signed-off-by: Xionghu Luo Signed-off-by: Xionghu Luo --- gcc/testsuite/gcc.misc-tests/gcov-pr93680.c | 24 +++++++++++++++++++++ gcc/tree-cfg.cc | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-pr93680.c diff --git a/gcc/testsuite/gcc.misc-tests/gcov-pr93680.c b/gcc/testsuite/gcc.misc-tests/gcov-pr93680.c new file mode 100644 index 00000000000..b2bf9e626fc --- /dev/null +++ b/gcc/testsuite/gcc.misc-tests/gcov-pr93680.c @@ -0,0 +1,24 @@ +/* { dg-options "-fprofile-arcs -ftest-coverage" } */ +/* { dg-do run { target native } } */ + +int f(int s, int n) +{ + int p = 0; + + switch (s) + { + case 0: /* count(5) */ + do { p++; } while (--n); /* count(5) */ + return p; /* count(1) */ + + case 1: /* count(5) */ + do { p++; } while (--n); /* count(5) */ + return p; /* count(1) */ + } + + return 0; +} + +int main() { f(0, 5); f(1, 5); return 0; } + +/* { dg-final { run-gcov gcov-pr93680.c } } */ diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc index a9fcc7fd050..6fa1d83d366 100644 --- a/gcc/tree-cfg.cc +++ b/gcc/tree-cfg.cc @@ -3009,7 +3009,7 @@ split_edge_bb_loc (edge edge_in) if (dest_prev) { edge e = find_edge (dest_prev, dest); - if (e && !(e->flags & EDGE_COMPLEX)) + if ((e && !(e->flags & EDGE_COMPLEX)) || edge_in->src == edge_in->dest) return edge_in->src; } return dest_prev; From patchwork Thu Mar 2 02:29:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xionghu Luo X-Patchwork-Id: 65877 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id DBB2A3857803 for ; Thu, 2 Mar 2023 02:30:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DBB2A3857803 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677724244; bh=yYEoj+46rNydxf3gkg+CcaEErEQXYdai8kiEXBCmwP4=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=IRw685HPq/6nleIFgdUVGnL7AURTIwDDEgV74Orsi/COFxjJBnkWK2cQVl0RFK3Ri FKFa1GtvQdzypDxvUQph9HASnddirR9Z8x2A6rC6uxHJgzEuAn1Gr1aUy6OD+iGekg LlGpo0Z230cCMo0MCjR9PD164fjUEybQRC8Nz66w= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from VM-122-127-centos.localdomain (unknown [43.132.141.3]) by sourceware.org (Postfix) with ESMTPS id 1CD243858D33; Thu, 2 Mar 2023 02:30:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1CD243858D33 Received: by VM-122-127-centos.localdomain (Postfix, from userid 1009) id B38C540FD0; Thu, 2 Mar 2023 10:30:11 +0800 (CST) To: gcc-patches@gcc.gnu.org Cc: luoxhu@gcc.gnu.org, rguenther@suse.de, hubicka@ucw.cz, Xionghu Luo Subject: [PATCH 2/2] gcov: Fix incorrect gimple line LOCATION [PR97923] Date: Thu, 2 Mar 2023 10:29:21 +0800 Message-Id: <20230302022921.4055291-2-xionghuluo@tencent.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20230302022921.4055291-1-xionghuluo@tencent.com> References: <20230302022921.4055291-1-xionghuluo@tencent.com> MIME-Version: 1.0 X-Spam-Status: No, score=-7.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_QUARANTINE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, NO_DNS_FOR_FROM, RCVD_IN_PBL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Xionghu Luo via Gcc-patches From: Xionghu Luo Reply-To: Xionghu Luo Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" For case like belowi test.c: 1:int foo(char c) 2:{ 3: return ((c >= 'A' && c <= 'Z') 4: || (c >= 'a' && c <= 'z') 5: || (c >= '0' && c <='0'));} the generated line number is incorrect for condition c>='A' of block 2: Thus correct the condition op0 location. gcno diff before and with this patch: test.gcno: 575: block 11: 1:0001(tree) test.gcno: 583: 01450000: 35:LINES -test.gcno: 595: block 2:`test.c':1, 5 +test.gcno: 595: block 2:`test.c':1, 3 test.gcno: 626: 01450000: 31:LINES test.gcno: 638: block 3:`test.c':3 test.gcno: 665: 01450000: 31:LINES test.gcno: 677: block 4:`test.c':4 test.gcno: 704: 01450000: 31:LINES test.gcno: 716: block 5:`test.c':4 test.gcno: 743: 01450000: 31:LINES test.gcno: 755: block 6:`test.c':5 Also save line id in line vector for gcov debug use. Regression tested pass on x86_64-linux-gnu and aarch64-linux-gnu, OK for master? gcc/ChangeLog: PR gcov/97923 * gcov.cc (line_info::line_info): Init id. (solve_flow_graph): Fix typo. (add_line_counts): Set line->id. * gimplify.cc (shortcut_cond_r): Correct cond expr op0 location. gcc/testsuite/ChangeLog: PR gcov/97923 * gcc.misc-tests/gcov-pr97923.c: New test. Signed-off-by: Xionghu Luo --- gcc/gcov.cc | 9 ++++++--- gcc/gimplify.cc | 6 ++++-- gcc/testsuite/gcc.misc-tests/gcov-pr97923.c | 13 +++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-pr97923.c diff --git a/gcc/gcov.cc b/gcc/gcov.cc index 2ec7248cc0e..77ca94c71c4 100644 --- a/gcc/gcov.cc +++ b/gcc/gcov.cc @@ -205,6 +205,8 @@ public: /* Execution count. */ gcov_type count; + unsigned id; + /* Branches from blocks that end on this line. */ vector branches; @@ -216,8 +218,8 @@ public: unsigned has_unexecuted_block : 1; }; -line_info::line_info (): count (0), branches (), blocks (), exists (false), - unexceptional (0), has_unexecuted_block (0) +line_info::line_info (): count (0), id (0), branches (), blocks (), + exists (false), unexceptional (0), has_unexecuted_block (0) { } @@ -2370,7 +2372,7 @@ solve_flow_graph (function_info *fn) /* If the graph has been correctly solved, every block will have a valid count. */ - for (unsigned i = 0; ix < fn->blocks.size (); i++) + for (unsigned i = 0; i < fn->blocks.size (); i++) if (!fn->blocks[i].count_valid) { fnotice (stderr, "%s:graph is unsolvable for '%s'\n", @@ -2730,6 +2732,7 @@ add_line_counts (coverage_info *coverage, function_info *fn) } line->count += block->count; } + line->id = ln; } has_any_line = true; diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index ade6e335da7..341a27b033e 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -3915,7 +3915,8 @@ shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p, false_label_p = &local_label; /* Keep the original source location on the first 'if'. */ - t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p, locus); + tree op0 = TREE_OPERAND (pred, 0); + t = shortcut_cond_r (op0, NULL, false_label_p, EXPR_LOCATION (op0)); append_to_statement_list (t, &expr); /* Set the source location of the && on the second 'if'. */ @@ -3938,7 +3939,8 @@ shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p, true_label_p = &local_label; /* Keep the original source location on the first 'if'. */ - t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL, locus); + tree op0 = TREE_OPERAND (pred, 0); + t = shortcut_cond_r (op0, true_label_p, NULL, EXPR_LOCATION (op0)); append_to_statement_list (t, &expr); /* Set the source location of the || on the second 'if'. */ diff --git a/gcc/testsuite/gcc.misc-tests/gcov-pr97923.c b/gcc/testsuite/gcc.misc-tests/gcov-pr97923.c new file mode 100644 index 00000000000..ad4f7d40817 --- /dev/null +++ b/gcc/testsuite/gcc.misc-tests/gcov-pr97923.c @@ -0,0 +1,13 @@ +/* { dg-options "-fprofile-arcs -ftest-coverage" } */ +/* { dg-do run { target native } } */ + +int foo(int c) +{ + return ((c >= 'A' && c <= 'Z') /* count(1*) */ + || (c >= 'a' && c <= 'z') /* count(1*) */ + || (c >= '0' && c <= '0')); /* count(1*) */ +} + +int main() { foo(0); } + +/* { dg-final { run-gcov gcov-pr97923-1.c } } */