From patchwork Mon Apr 8 14:18:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?J=C3=B8rgen_Kvalsvik?= X-Patchwork-Id: 1920869 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (4096-bit key; secure) header.d=kolabnow.com header.i=@kolabnow.com header.a=rsa-sha256 header.s=dkim20160331 header.b=kMwzAONW; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VCrn31MxMz1yYM for ; Tue, 9 Apr 2024 00:19:02 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id EAF73385841C for ; Mon, 8 Apr 2024 14:19:00 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx.kolabnow.com (mx.kolabnow.com [212.103.80.154]) by sourceware.org (Postfix) with ESMTPS id 8D6FD3858D32 for ; Mon, 8 Apr 2024 14:18:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8D6FD3858D32 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=lambda.is Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=lambda.is ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 8D6FD3858D32 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=212.103.80.154 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712585919; cv=none; b=OCwNl5AJTfzYB6dnB0Jb7geiLP4cKKF4pikBIjR39+adRlIQiH6r85toQuTpEjk/q8g886HPYwW+hG1Kh180Gz3eFKiv94hinW8I5ThgTI+enEcevpOyhiZd77ciIP8vQ0ITS+QgwdwkEGVvJ0mHTh+xh0lJYnbYY6TX+jEGhK0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712585919; c=relaxed/simple; bh=vrCL3gABywPdjDGZstbBkOfJGxad9MXwD/A9j5TVtpE=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=YglciYZoj9R4Yeypg/HD1CUCNmftj23I272bBEcJ/hVJHcTzciK5oVM4DTcCQ5pjujrKWOa1tWIYWdfKcD8fLX0eiieP6MEADubE6Q9qWlmCW4hX18AC+n0cDIozO1A/ocm+xaeobX9BmihZS+wnYF2OXpold+jleFhFW2feVDU= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from localhost (unknown [127.0.0.1]) by mx.kolabnow.com (Postfix) with ESMTP id 386AD30D84B3; Mon, 8 Apr 2024 16:18:33 +0200 (CEST) Authentication-Results: ext-mx-out013.mykolab.com (amavis); dkim=pass (4096-bit key) reason="pass (just generated, assumed good)" header.d=kolabnow.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kolabnow.com; h= content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:date:subject:subject:from:from:received :received:received; s=dkim20160331; t=1712585910; x=1714400311; bh=O33mcM6wI5gXOrzAfhC+vXYFvX4OlZBno0u+sNlIszc=; b=kMwzAONWvP42 9sVQkRh3Xc5qPq1HUt+dIL77rjaVkTXk17WbtQfsOmSTWlp4br60gFvC2ePTuOte HXpge0SMSGxBanUiHrc5aOcQqzmxmZv6ISXQAGwqSdalBBTWnOrqAMpEHLGc6n9R cXmafBUKO073DJLvCSFwKRKVGzQBcrsyxTSHUks0g9e2Lf7pfBZAOleTPQQ24Zvn M25zoM2XxV/ZiVaj0uNcwslQ+gD/vIiQULd4zc+AzpFP8UW5XXeMFt4/E94bcLm2 p/M1oG/PiSdiy0Ah3TLb3aVPKzLa7i8TeUSIpPBeHbAz9QpGEQMeaWlEL44+XLgD BhlYByWAmNVRi7YohBpk4N/XQUeGItp+QkDqi+CbC6iDj0BDoM25jBCN7tNfBHOP oCXbtZ1YsKwBqQul7Myc1bFjSt72TNbalLP5qnUcIZFMrlOZvwljQBC5ucyWelB3 /bTL6tHVgXDfkSZO7XaBhTK+QyO8LsswA+wF440Q4kYbt00g0P3LGlCT9LNVZii+ UGrcUiCrrilCp0VhJZF8Kpb8zhgwSevAFVQtyS2YRfFicCHFzWRX9iOdcc+w56Rw a0gdlYJHW1wcV1UvRCzkMvWzUqtekSYaUmYFup6yaktuf4DD3TwKcIxh5IKPR/d3 M5/bbn5fHmnJVNlzWwEjgdm5U/vrQrc= X-Virus-Scanned: amavis at mykolab.com X-Spam-Score: -1 X-Spam-Level: X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 Received: from mx.kolabnow.com ([127.0.0.1]) by localhost (ext-mx-out013.mykolab.com [127.0.0.1]) (amavis, port 10024) with ESMTP id xuf03GG0YsJr; Mon, 8 Apr 2024 16:18:30 +0200 (CEST) Received: from int-mx009.mykolab.com (unknown [10.9.13.9]) by mx.kolabnow.com (Postfix) with ESMTPS id 02E2330D84A6; Mon, 8 Apr 2024 16:18:29 +0200 (CEST) Received: from ext-subm010.mykolab.com (unknown [10.9.6.10]) by int-mx009.mykolab.com (Postfix) with ESMTPS id B3C2E211474C; Mon, 8 Apr 2024 16:18:29 +0200 (CEST) From: =?utf-8?q?J=C3=B8rgen_Kvalsvik?= To: gcc-patches@gcc.gnu.org Cc: hjl.tools@gmail.com, rguenther@suse.de, hubicka@ucw.cz, sam@gentoo.org, =?utf-8?q?J=C3=B8rgen_Kvalsvik?= Subject: [PATCH 1/2] Add tree-inlined gconds to caller cond->expr map Date: Mon, 8 Apr 2024 16:18:14 +0200 Message-Id: <20240408141815.127984-2-j@lambda.is> In-Reply-To: <20240408141815.127984-1-j@lambda.is> References: <20240408141815.127984-1-j@lambda.is> MIME-Version: 1.0 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Properly add the condition -> expression mapping of inlined gconds from the caller into the callee map. This is a fix for PR114599 that works beyond fixing the segfault, as the previous fixed copied references to the source gconds, not the deep copied ones that end up in the calle body. The new tests checks this, both in the case of a calle without conditions (which triggered the segfault), and a test that shows that conditions are properly mapped, and not mixed. PR middle-end/114599 gcc/ChangeLog: * tree-inline.cc (copy_bb): Copy cond_uids into callee. (prepend_lexical_block): Remove outdated comment. (add_local_variables): Remove bad cond_uids copy. gcc/testsuite/ChangeLog: * gcc.misc-tests/gcov-19.c: New test. --- gcc/testsuite/gcc.misc-tests/gcov-19.c | 37 ++++++++++++++++++++++ gcc/tree-inline.cc | 43 ++++++++++++++------------ 2 files changed, 61 insertions(+), 19 deletions(-) diff --git a/gcc/testsuite/gcc.misc-tests/gcov-19.c b/gcc/testsuite/gcc.misc-tests/gcov-19.c index b83a38531ba..78769fa57b8 100644 --- a/gcc/testsuite/gcc.misc-tests/gcov-19.c +++ b/gcc/testsuite/gcc.misc-tests/gcov-19.c @@ -1468,6 +1468,40 @@ mcdc026e (int a, int b, int c, int d, int e) return x + y; } +__attribute__((always_inline)) +inline int +mcdc027_inlined (int a) +{ + if (a) + x = a; + else + x = 1; + + return a + 1; +} + +/* Check that conditions in a function inlined into a function without + conditionals works. */ +void +mcdc027a (int a) /* conditions(1/2) false(0) */ + /* conditions(end) */ +{ + mcdc027_inlined (a); +} + +/* Check that conditions in a function inlined into a function with + conditionals works and that the conditions are not mixed up. */ +void +mcdc027b (int a) /* conditions(1/2) false(0) */ + /* conditions(end) */ +{ + int v = mcdc027_inlined (a); + + if (v > 10) /* conditions(1/2) true(0) */ + /* condiitions(end) */ + x = 10; +} + int main () { mcdc001a (0, 1); @@ -1721,6 +1755,9 @@ int main () mcdc026e (1, 1, 1, 0, 1); mcdc026e (1, 1, 0, 0, 1); mcdc026e (1, 1, 1, 1, 1); + + mcdc027a (1); + mcdc027b (1); } /* { dg-final { run-gcov conditions { --conditions gcov-19.c } } } */ diff --git a/gcc/tree-inline.cc b/gcc/tree-inline.cc index b18917707cc..5f852885e7f 100644 --- a/gcc/tree-inline.cc +++ b/gcc/tree-inline.cc @@ -2049,6 +2049,17 @@ copy_bb (copy_body_data *id, basic_block bb, copy_gsi = gsi_start_bb (copy_basic_block); + unsigned min_cond_uid = 0; + if (id->src_cfun->cond_uids) + { + if (!cfun->cond_uids) + cfun->cond_uids = new hash_map (); + + for (auto itr : *id->src_cfun->cond_uids) + if (itr.second >= min_cond_uid) + min_cond_uid = itr.second + 1; + } + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { gimple_seq stmts; @@ -2076,6 +2087,18 @@ copy_bb (copy_body_data *id, basic_block bb, if (gimple_nop_p (stmt)) continue; + /* If -fcondition-coverage is used, register the inlined conditions + in the cond->expression mapping of the caller. The expression tag + is shifted conditions from the two bodies are not mixed. */ + if (id->src_cfun->cond_uids && is_a (orig_stmt)) + { + gcond *orig_cond = as_a (orig_stmt); + gcond *cond = as_a (stmt); + unsigned *v = id->src_cfun->cond_uids->get (orig_cond); + if (v) + cfun->cond_uids->put (cond, *v + min_cond_uid); + } + gimple_duplicate_stmt_histograms (cfun, stmt, id->src_cfun, orig_stmt); @@ -4659,8 +4682,7 @@ prepend_lexical_block (tree current_block, tree new_block) BLOCK_SUPERCONTEXT (new_block) = current_block; } -/* Add local variables from CALLEE to CALLER. If set for condition coverage, - copy basic condition -> expression mapping to CALLER. */ +/* Add local variables from CALLEE to CALLER. */ static inline void add_local_variables (struct function *callee, struct function *caller, @@ -4690,23 +4712,6 @@ add_local_variables (struct function *callee, struct function *caller, } add_local_decl (caller, new_var); } - - /* If -fcondition-coverage is used and the caller has conditions, copy the - mapping into the caller but and the end so the caller and callee - expressions aren't mixed. */ - if (callee->cond_uids) - { - if (!caller->cond_uids) - caller->cond_uids = new hash_map (); - - unsigned dst_max_uid = 0; - for (auto itr : *callee->cond_uids) - if (itr.second >= dst_max_uid) - dst_max_uid = itr.second + 1; - - for (auto itr : *callee->cond_uids) - caller->cond_uids->put (itr.first, itr.second + dst_max_uid); - } } /* Add to BINDINGS a debug stmt resetting SRCVAR if inlining might From patchwork Mon Apr 8 14:18:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?J=C3=B8rgen_Kvalsvik?= X-Patchwork-Id: 1920870 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (4096-bit key; secure) header.d=kolabnow.com header.i=@kolabnow.com header.a=rsa-sha256 header.s=dkim20160331 header.b=h2H1Ss6t; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VCrn3244sz1yYf for ; Tue, 9 Apr 2024 00:19:03 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B042F3861001 for ; Mon, 8 Apr 2024 14:19:00 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx.kolabnow.com (mx.kolabnow.com [212.103.80.155]) by sourceware.org (Postfix) with ESMTPS id 8A9723858D28 for ; Mon, 8 Apr 2024 14:18:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8A9723858D28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=lambda.is Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=lambda.is ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 8A9723858D28 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=212.103.80.155 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712585919; cv=none; b=obyyow0Ds3/VjvG5ac2asjS3as4KbuipU2+DFcToymMu6SeKFBxTCKeoD2YK+kX4TvYp74yjd88y1Be5hDvAgT/D2qyNW3lZh13JeAfNZu2xNll52vVAX3+gsTZaPgwbelJOtHbraPN/na6mQ1Kqh/1noiMlCSmnLouqQr3EYLM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712585919; c=relaxed/simple; bh=TMsNes9yFcADkkjXLwKiEca/denuuscAeXU+EhZam9I=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=Wa4Rysu15OvxzSFLmAzS1wWZkMSfYpm6UGUMx44/W+q4qVHAYuHq0nPSxa4Nzupq/+FoDmEX6WZR7z6p3RXzK6Ta5reddh9g/0XpfHQzyv+VL3jin6WqvR28dit326sSzS10yK85n+HMU3Kkf2VpOIM0IwQsP1w+GVAnWDeEpfU= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from localhost (unknown [127.0.0.1]) by mx.kolabnow.com (Postfix) with ESMTP id 2EBBB2096DEC; Mon, 8 Apr 2024 16:18:33 +0200 (CEST) Authentication-Results: ext-mx-out011.mykolab.com (amavis); dkim=pass (4096-bit key) reason="pass (just generated, assumed good)" header.d=kolabnow.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kolabnow.com; h= content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:date:subject:subject:from:from:received :received:received; s=dkim20160331; t=1712585912; x=1714400313; bh=qZmQNrmvIIjH0D0pFc17SH3AODwG0gG0S03/5dlLy5M=; b=h2H1Ss6tVdF8 bi8CUWUQHMrqM4Q5n4SsNRs26T6JU3qxR/X9cucP/euNoRVgrq+xP3WKzJB6wTh2 pIHsd22lA/nlRYpJJlYZ9byfekd0zp31shmfHlai6zbcI3A6Dyu0Dai46jQvAt8L vaiz6pxwRcvD6bzttarmvjbO8Ow3N68lpSq7ZbPM3VVzcvXQCsqjkvSdW/bv+ZJL jDyBytNHRalBj5AKQxi8Qmu+Nnl9gw9vSi94mApNvb7r1lTP6z7vG3yYTE0Tkwsf 51cC4FxiR+jYm3m1fwU7TB7n5H6VqOFUx3Rmuosn8cOhMEnm8OYYSGVNWs7hO4/S 9s+ZdLgrS2aPuWqHvWi360ign31rGJcD3j7Hrxry6w8LixTs9LyyjEXPgqPslJgP 3wzFw+x2FAY+c9TtXioZXFPzc/K5t5e1ZQYxKX+nB7/xyV/hTFbVqt3NmNlc5JHt jWI+dPEMxkLhqMA2Aec6H/0lrs+oDltr2lQr2f3KTboYOsVsdqwy3BZE1jBW7Yo0 SrWVoOcObFVDQ+5hvZ3nNxotqVXzoeg7F9oxmVLsQJC3HlaKgd43//6GHgHZOOJR gCUxJn8ph+dNOCLP/JvaTk5rWloo3OghfGcXAvq5P63cTAK9IVWo8I2JRi1uXCfR 770pdmwEK5nGjyHp8b1gEKCrh3GMi+I= X-Virus-Scanned: amavis at mykolab.com X-Spam-Score: -1 X-Spam-Level: X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 Received: from mx.kolabnow.com ([127.0.0.1]) by localhost (ext-mx-out011.mykolab.com [127.0.0.1]) (amavis, port 10024) with ESMTP id 5furccgjumXo; Mon, 8 Apr 2024 16:18:32 +0200 (CEST) Received: from int-mx009.mykolab.com (unknown [10.9.13.9]) by mx.kolabnow.com (Postfix) with ESMTPS id E78292096DEB; Mon, 8 Apr 2024 16:18:31 +0200 (CEST) Received: from ext-subm010.mykolab.com (unknown [10.9.6.10]) by int-mx009.mykolab.com (Postfix) with ESMTPS id B23742114755; Mon, 8 Apr 2024 16:18:31 +0200 (CEST) From: =?utf-8?q?J=C3=B8rgen_Kvalsvik?= To: gcc-patches@gcc.gnu.org Cc: hjl.tools@gmail.com, rguenther@suse.de, hubicka@ucw.cz, sam@gentoo.org, =?utf-8?q?J=C3=B8rgen_Kvalsvik?= Subject: [PATCH 2/2] Generate constant at start of loop, without UB Date: Mon, 8 Apr 2024 16:18:15 +0200 Message-Id: <20240408141815.127984-3-j@lambda.is> In-Reply-To: <20240408141815.127984-1-j@lambda.is> References: <20240408141815.127984-1-j@lambda.is> MIME-Version: 1.0 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Generating the constants used for recording the edges taken for condition coverage would trigger undefined behavior when an expression had exactly 64 (== sizeof (1ULL)) conditions, as it would generate the constant for the next iteration at the end of the loop body, even if there was never a next iteration. By moving the check and constant generation to the top of the loop and hoisting the increment flag there is no opportunity for UB. PR 114627 gcc/ChangeLog: * tree-profile.cc (instrument_decisions): Generate constant at the start of loop. --- gcc/tree-profile.cc | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc index 33ff550a7bc..e58f5c83472 100644 --- a/gcc/tree-profile.cc +++ b/gcc/tree-profile.cc @@ -1049,6 +1049,7 @@ instrument_decisions (array_slice expr, size_t condno, zerocounter[2] = zero; unsigned xi = 0; + bool increment = false; tree rhs = build_int_cst (gcov_type_node, 1ULL << xi); for (basic_block current : expr) { @@ -1057,7 +1058,14 @@ instrument_decisions (array_slice expr, size_t condno, candidates.safe_push (zerocounter); counters prev = resolve_counters (candidates); - int increment = 0; + if (increment) + { + xi += 1; + gcc_checking_assert (xi < sizeof (uint64_t) * BITS_PER_UNIT); + rhs = build_int_cst (gcov_type_node, 1ULL << xi); + increment = false; + } + for (edge e : current->succs) { counters next = prev; @@ -1072,7 +1080,7 @@ instrument_decisions (array_slice expr, size_t condno, tree m = build_int_cst (gcov_type_node, masks[2*xi + k]); next[2] = emit_bitwise_op (e, prev[2], BIT_IOR_EXPR, m); } - increment = 1; + increment = true; } else if (e->flags & EDGE_COMPLEX) { @@ -1085,11 +1093,13 @@ instrument_decisions (array_slice expr, size_t condno, } table.get_or_insert (e->dest).safe_push (next); } - xi += increment; - if (increment) - rhs = build_int_cst (gcov_type_node, 1ULL << xi); } + /* Since this is also the return value, the number of conditions, make sure + to include the increment of the last basic block. */ + if (increment) + xi += 1; + gcc_assert (xi == bitmap_count_bits (core)); const tree relaxed = build_int_cst (integer_type_node, MEMMODEL_RELAXED);