From patchwork Thu Nov 4 10:47:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aldy Hernandez X-Patchwork-Id: 47043 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 8C697385842B for ; Thu, 4 Nov 2021 10:48:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8C697385842B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1636022906; bh=H4NwYQVmNCdDUmwg53qav2nbwNzc6fsimPJ2N/+VeeY=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=l772E/7D7sCPNe7EtMsTUN7Zp8SnekfHlZzyRUxLOzHGO3xGAgRhnAMpusqgZSGFR pFw6MALG9Gflp+p1nMdpN8TGujUnpzlAeyrzqpRE/pAI/lwm9d6WJrrp3vqpIGycTm U1iOrZxQuTCCYz6QwQ9u4Fcl/iKj7xAp/OPVkoTk= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTPS id 290C63858C3A for ; Thu, 4 Nov 2021 10:47:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 290C63858C3A Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-423-EVEYBG9CPam1l0gcY80Vzg-1; Thu, 04 Nov 2021 06:47:55 -0400 X-MC-Unique: EVEYBG9CPam1l0gcY80Vzg-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 06950100A644 for ; Thu, 4 Nov 2021 10:47:54 +0000 (UTC) Received: from abulafia.quesejoda.com (unknown [10.39.193.46]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9C47857CD2; Thu, 4 Nov 2021 10:47:53 +0000 (UTC) Received: from abulafia.quesejoda.com (localhost [127.0.0.1]) by abulafia.quesejoda.com (8.16.1/8.15.2) with ESMTPS id 1A4Alo1E1031373 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Thu, 4 Nov 2021 11:47:51 +0100 Received: (from aldyh@localhost) by abulafia.quesejoda.com (8.16.1/8.16.1/Submit) id 1A4Alopc1031372; Thu, 4 Nov 2021 11:47:50 +0100 To: GCC patches Subject: [COMMITTED] Convert arrays in ssa pointer_equiv_analyzer to auto_vec's. Date: Thu, 4 Nov 2021 11:47:14 +0100 Message-Id: <20211104104713.1031288-1-aldyh@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Aldy Hernandez via Gcc-patches From: Aldy Hernandez Reply-To: Aldy Hernandez Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" The problem in this PR is an off-by-one bug. We should've allocated num_ssa_names + 1. However, in fixing this, I noticed that num_ssa_names can change between queries, so I have replaced the array with an auto_vec and added code to grow the vector as necessary. Tested on x86-64 Linux. PR 103062 gcc/ChangeLog: PR tree-optimization/103062 * value-pointer-equiv.cc (ssa_equiv_stack::ssa_equiv_stack): Increase size of allocation by 1. (ssa_equiv_stack::push_replacement): Grow as needed. (ssa_equiv_stack::get_replacement): Same. (pointer_equiv_analyzer::pointer_equiv_analyzer): Same. (pointer_equiv_analyzer::~pointer_equiv_analyzer): Remove delete. (pointer_equiv_analyzer::set_global_equiv): Grow as needed. (pointer_equiv_analyzer::get_equiv): Same. (pointer_equiv_analyzer::get_equiv_expr): Remove const. * value-pointer-equiv.h (class pointer_equiv_analyzer): Remove const markers. Use auto_vec instead of tree *. gcc/testsuite/ChangeLog: * gcc.dg/pr103062.c: New test. --- gcc/testsuite/gcc.dg/pr103062.c | 7 ++++++ gcc/value-pointer-equiv.cc | 43 ++++++++++++++++++++++++--------- gcc/value-pointer-equiv.h | 6 ++--- 3 files changed, 41 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr103062.c diff --git a/gcc/testsuite/gcc.dg/pr103062.c b/gcc/testsuite/gcc.dg/pr103062.c new file mode 100644 index 00000000000..cbc371b4cd5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr103062.c @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options "-O2 -fno-tree-forwprop" } + +void *a, *b, *c; +void foo(void) { + c = (void *)((__INTPTR_TYPE__)a & (__INTPTR_TYPE__)b); +} diff --git a/gcc/value-pointer-equiv.cc b/gcc/value-pointer-equiv.cc index 7d2658b77a4..f07d5d5c7ce 100644 --- a/gcc/value-pointer-equiv.cc +++ b/gcc/value-pointer-equiv.cc @@ -58,7 +58,7 @@ public: void enter (basic_block); void leave (basic_block); void push_replacement (tree name, tree replacement); - tree get_replacement (tree name) const; + tree get_replacement (tree name); private: auto_vec> m_stack; @@ -68,7 +68,7 @@ private: ssa_equiv_stack::ssa_equiv_stack () { - m_replacements.safe_grow_cleared (num_ssa_names); + m_replacements.safe_grow_cleared (num_ssa_names + 1); } // Pushes a marker at the given point. @@ -99,29 +99,38 @@ ssa_equiv_stack::leave (basic_block) void ssa_equiv_stack::push_replacement (tree name, tree replacement) { - tree old = m_replacements[SSA_NAME_VERSION (name)]; - m_replacements[SSA_NAME_VERSION (name)] = replacement; + unsigned v = SSA_NAME_VERSION (name); + + if (v >= m_replacements.length ()) + m_replacements.safe_grow_cleared (num_ssa_names + 1); + + tree old = m_replacements[v]; + m_replacements[v] = replacement; m_stack.safe_push (std::make_pair (name, old)); } // Return the equivalence of NAME. tree -ssa_equiv_stack::get_replacement (tree name) const +ssa_equiv_stack::get_replacement (tree name) { - return m_replacements[SSA_NAME_VERSION (name)]; + unsigned v = SSA_NAME_VERSION (name); + + if (v >= m_replacements.length ()) + m_replacements.safe_grow_cleared (num_ssa_names + 1); + + return m_replacements[v]; } pointer_equiv_analyzer::pointer_equiv_analyzer (gimple_ranger *r) { m_ranger = r; - m_global_points = new tree[num_ssa_names] (); + m_global_points.safe_grow_cleared (num_ssa_names + 1); m_cond_points = new ssa_equiv_stack; } pointer_equiv_analyzer::~pointer_equiv_analyzer () { - delete[] m_global_points; delete m_cond_points; } @@ -130,7 +139,12 @@ pointer_equiv_analyzer::~pointer_equiv_analyzer () void pointer_equiv_analyzer::set_global_equiv (tree ssa, tree pointee) { - m_global_points[SSA_NAME_VERSION (ssa)] = pointee; + unsigned v = SSA_NAME_VERSION (ssa); + + if (v >= m_global_points.length ()) + m_global_points.safe_grow_cleared (num_ssa_names + 1); + + m_global_points[v] = pointee; } // Set the conditional pointer equivalency for SSA to POINTEE. @@ -146,9 +160,14 @@ pointer_equiv_analyzer::set_cond_equiv (tree ssa, tree pointee) // conditional info. tree -pointer_equiv_analyzer::get_equiv (tree ssa) const +pointer_equiv_analyzer::get_equiv (tree ssa) { - tree ret = m_global_points[SSA_NAME_VERSION (ssa)]; + unsigned v = SSA_NAME_VERSION (ssa); + + if (v >= m_global_points.length ()) + m_global_points.safe_grow_cleared (num_ssa_names + 1); + + tree ret = m_global_points[v]; if (ret) return ret; return m_cond_points->get_replacement (ssa); @@ -211,7 +230,7 @@ pointer_equiv_analyzer::leave (basic_block bb) // nor an invariant. tree -pointer_equiv_analyzer::get_equiv_expr (tree_code code, tree expr) const +pointer_equiv_analyzer::get_equiv_expr (tree_code code, tree expr) { if (code == SSA_NAME) return get_equiv (expr); diff --git a/gcc/value-pointer-equiv.h b/gcc/value-pointer-equiv.h index 0921579d52a..dc747d0af70 100644 --- a/gcc/value-pointer-equiv.h +++ b/gcc/value-pointer-equiv.h @@ -38,17 +38,17 @@ public: void enter (basic_block); void leave (basic_block); void visit_stmt (gimple *stmt); - tree get_equiv (tree ssa) const; + tree get_equiv (tree ssa); private: void visit_edge (edge e); - tree get_equiv_expr (tree_code code, tree expr) const; + tree get_equiv_expr (tree_code code, tree expr); void set_global_equiv (tree ssa, tree pointee); void set_cond_equiv (tree ssa, tree pointee); gimple_ranger *m_ranger; // Global pointer equivalency indexed by SSA_NAME_VERSION. - tree *m_global_points; + auto_vec m_global_points; // Conditional pointer equivalency. class ssa_equiv_stack *m_cond_points; };