From patchwork Wed Mar 15 10:48:32 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 70114 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2254220wrd; Wed, 15 Mar 2023 03:49:20 -0700 (PDT) X-Google-Smtp-Source: AK7set/8rB5uPco+gFfwIp4AhqAwy6VdmBuTZPlh0+/jGGkbTVlsskDnxGNLoXhxM7xo/S8vV1gd X-Received: by 2002:a17:906:fc5:b0:8aa:c090:a9ef with SMTP id c5-20020a1709060fc500b008aac090a9efmr5476131ejk.55.1678877360411; Wed, 15 Mar 2023 03:49:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1678877360; cv=none; d=google.com; s=arc-20160816; b=Y3szrOjW9dooEwksDVs58Yz13EnnEvX1M6wzxPxU1OBcndUUpiyhrUgfZWxVX75MoZ /86O1sct1/cUjdSwmNBW6j7UlusRM+C2bLZ52Vs6zF4533S4+3yggbkSinP958fdGwTJ 3Y4dUZH7QCqo1rG4J0thV2o9NW7KHdKmPS/JE97EB4GKHKT0iXAwnHhg9nNqjB8/NvY+ TM7O9fABkLVRz/n7L91gYwWEAVsZaigeOYJbCmAAIqqZA4Xa3HJFIvbFnAIPaDFjTi6Y ZifYBb9ydENUSYFSlaBUWHJTChIIakbZxNGbT5hTMv++EPuHNw7E25ohe4azQHxlHVia B11g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:sender:errors-to:reply-to:from:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence :mime-version:user-agent:subject:cc:to:date:dmarc-filter :delivered-to:dkim-signature:dkim-filter; bh=63GYkNksx6Q+ffc/vYDM8jCv985AOZsoew8Y8yMeIws=; b=ubmJcq5JdVfVT/BEjl1wj7oU2MbJnSC1kMc3Two3BjG3KQFml24s2hQln+7QjKzPSZ aASp9VbH6YVxPtofax5Qt08EnseB/vSAC5vNlww53GIUhdkU6vDjm4ZyGu+YcA75pHzN dzlWLHh6zEYSFtOYpFak1yvjAGE8X3oJan7W3/uRcrJsIaLbrs2wYI0WtSCH8+rtsyw0 yD1s6Bg4RCp16gTk/yzXIf2/3a+vIBDWwMnRBPqtvkq/3n240sOKsu8kyFLbsM3xULfG AmkRFCIZVaX4HRuukJjU9+3KcL3nZFJeaPPYqR2B+1VPKWNPC0+seVdMH1NWCd9okq8O ApaQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=P9MZzhYx; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id z14-20020a170906240e00b00923b37ea84fsi5221695eja.59.2023.03.15.03.49.20 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Mar 2023 03:49:20 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=P9MZzhYx; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 38328385840E for ; Wed, 15 Mar 2023 10:49:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 38328385840E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1678877359; bh=63GYkNksx6Q+ffc/vYDM8jCv985AOZsoew8Y8yMeIws=; h=Date:To:cc:Subject:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=P9MZzhYxMM9ApNI5Ar3KoucnMzmk9mFwUP8N9s5wrL7fwL02tHTBL7XsFjzUHdbUj kUsRVjyshC/Jd731uvUzsu6OO+b7PMVDry9QkPbTV2+veiWHJBm2P2QWGeykCN0J/Z NyyNDy0vhVFSIRZpZNhIgaCqm7O7CNvDFfYa1ixM= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id 14BD23858D33 for ; Wed, 15 Mar 2023 10:48:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 14BD23858D33 Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 068C32199A; Wed, 15 Mar 2023 10:48:33 +0000 (UTC) Received: from wotan.suse.de (wotan.suse.de [10.160.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by relay2.suse.de (Postfix) with ESMTPS id ECD3C2C141; Wed, 15 Mar 2023 10:48:32 +0000 (UTC) Date: Wed, 15 Mar 2023 10:48:32 +0000 (UTC) To: gcc-patches@gcc.gnu.org cc: Jakub Jelinek Subject: [PATCH 1/2] Avoid random stmt order result in pass_waccess::use_after_inval_p User-Agent: Alpine 2.22 (LSU 394 2020-01-19) MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, MISSING_MID, SPF_HELO_NONE, SPF_PASS, 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: Richard Biener via Gcc-patches From: Richard Biener Reply-To: Richard Biener Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" Message-Id: <20230315104919.38328385840E@sourceware.org> X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1760430507221265051?= X-GMAIL-MSGID: =?utf-8?q?1760430507221265051?= use_after_inval_p uses stmt UIDs to speed up repeated dominance checks within a basic-block but it fails to assign UIDs to PHIs which means compares with PHIs in the same block get a random result. The following factors renumber_gimple_stmt_uids to expose a new renumber_gimple_stmt_uids_in_block we can share. This XFAILs the conditional loop case in gcc.dg/Wuse-after-free-2.c Bootstrap and regtest running on x86_64-unknown-linux-gnu. This makes 2/2 a net positive on the testsuite (the early waccess would not run into this bug) OK if testing succeeds? (we could also special-case PHIs somehow and assert we never get to compare two PHIs here) * tree-dfa.h (renumber_gimple_stmt_uids_in_block): New. * tree-dfa.cc (renumber_gimple_stmt_uids_in_block): Split out from ... (renumber_gimple_stmt_uids): ... here and (renumber_gimple_stmt_uids_in_blocks): ... here. * gimple-ssa-warn-access.cc (pass_waccess::use_after_inval_p): Use renumber_gimple_stmt_uids_in_block to also assign UIDs to PHIs. * gcc.dg/Wuse-after-free-2.c: XFAIL conditional loop case. --- gcc/gimple-ssa-warn-access.cc | 8 +--- gcc/testsuite/gcc.dg/Wuse-after-free-2.c | 4 +- gcc/tree-dfa.cc | 48 +++++++++++------------- gcc/tree-dfa.h | 1 + 4 files changed, 25 insertions(+), 36 deletions(-) diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc index 8b1c1cc019e..a8ad7a6df65 100644 --- a/gcc/gimple-ssa-warn-access.cc +++ b/gcc/gimple-ssa-warn-access.cc @@ -3862,13 +3862,7 @@ pass_waccess::use_after_inval_p (gimple *inval_stmt, gimple *use_stmt, to consecutive statements in it. Use the ids to determine which precedes which. This avoids the linear traversal on subsequent visits to the same block. */ - for (auto si = gsi_start_bb (inval_bb); !gsi_end_p (si); - gsi_next_nondebug (&si)) - { - gimple *stmt = gsi_stmt (si); - unsigned uid = inc_gimple_stmt_max_uid (m_func); - gimple_set_uid (stmt, uid); - } + renumber_gimple_stmt_uids_in_block (m_func, inval_bb); return gimple_uid (inval_stmt) < gimple_uid (use_stmt); } diff --git a/gcc/testsuite/gcc.dg/Wuse-after-free-2.c b/gcc/testsuite/gcc.dg/Wuse-after-free-2.c index ebc051690db..cd5c43c0fa3 100644 --- a/gcc/testsuite/gcc.dg/Wuse-after-free-2.c +++ b/gcc/testsuite/gcc.dg/Wuse-after-free-2.c @@ -113,6 +113,6 @@ int warn_cond_loop (char *p) while (*q) ++q; - free (p); // { dg-message "call to 'free'" } - return *q; // { dg-warning "pointer 'q' used after 'free'" } + free (p); // dg-message "call to 'free'" + return *q; // { dg-warning "pointer 'q' used after 'free'" "" { xfail *-*-* } } } diff --git a/gcc/tree-dfa.cc b/gcc/tree-dfa.cc index ec8df0d6401..82803a8ccb1 100644 --- a/gcc/tree-dfa.cc +++ b/gcc/tree-dfa.cc @@ -59,6 +59,25 @@ static void collect_dfa_stats (struct dfa_stats_d *); Dataflow analysis (DFA) routines ---------------------------------------------------------------------------*/ +/* Renumber the gimple stmt uids in one block. The caller is responsible + of calling set_gimple_stmt_max_uid (fun, 0) at some point. */ + +void +renumber_gimple_stmt_uids_in_block (struct function *fun, basic_block bb) +{ + gimple_stmt_iterator bsi; + for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi)) + { + gimple *stmt = gsi_stmt (bsi); + gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fun)); + } + for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) + { + gimple *stmt = gsi_stmt (bsi); + gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fun)); + } +} + /* Renumber all of the gimple stmt uids. */ void @@ -68,19 +87,7 @@ renumber_gimple_stmt_uids (struct function *fun) set_gimple_stmt_max_uid (fun, 0); FOR_ALL_BB_FN (bb, fun) - { - gimple_stmt_iterator bsi; - for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi)) - { - gimple *stmt = gsi_stmt (bsi); - gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fun)); - } - for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) - { - gimple *stmt = gsi_stmt (bsi); - gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fun)); - } - } + renumber_gimple_stmt_uids_in_block (fun, bb); } /* Like renumber_gimple_stmt_uids, but only do work on the basic blocks @@ -93,20 +100,7 @@ renumber_gimple_stmt_uids_in_blocks (basic_block *blocks, int n_blocks) set_gimple_stmt_max_uid (cfun, 0); for (i = 0; i < n_blocks; i++) - { - basic_block bb = blocks[i]; - gimple_stmt_iterator bsi; - for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi)) - { - gimple *stmt = gsi_stmt (bsi); - gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun)); - } - for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) - { - gimple *stmt = gsi_stmt (bsi); - gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun)); - } - } + renumber_gimple_stmt_uids_in_block (cfun, blocks[i]); } diff --git a/gcc/tree-dfa.h b/gcc/tree-dfa.h index 1632487c3ed..074a4da3a6c 100644 --- a/gcc/tree-dfa.h +++ b/gcc/tree-dfa.h @@ -20,6 +20,7 @@ along with GCC; see the file COPYING3. If not see #ifndef GCC_TREE_DFA_H #define GCC_TREE_DFA_H +extern void renumber_gimple_stmt_uids_in_block (struct function *, basic_block); extern void renumber_gimple_stmt_uids (struct function *); extern void renumber_gimple_stmt_uids_in_blocks (basic_block *, int); extern void dump_variable (FILE *, tree);