From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by sourceware.org (Postfix) with ESMTPS id 4C0C83858CD1 for ; Sat, 15 Jul 2023 03:20:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4C0C83858CD1 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=marvell.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=marvell.com Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 36EN6lOL016067 for ; Fri, 14 Jul 2023 20:20:47 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=kheZed0zc7BDKCAlnhdFfuuvqeZq6nuTiQ2kExeDBqk=; b=AkRuV64GGKXMjpoKHVO4BIneO3qhUEz1gJ02D9DCU0QIvN04LPukkPTylIgvXUDv5YE3 gB0Trgd0MRREGY4eX6DCIRexfFTQiecNj7pbFE8onxW3tALR7+QwC5o7RkSONuMz0C6n KA7nnen0AgnxeOvcKF/OIWusVZm+LhUvTnQG4HtS8VjztV+b+ba6X6NxdvqFqEIxK7Rd cfH32lqjHDdFC/82SB9lQuBcRFs9hW7Nr1gQYL8XXU6nHuqT7lbjM9vLnDWGMn6Gz20g W4is69Dn2CFBnQ/2wfdELYDycXauoyA9uomTdwYxJMhigSxEZGZPTDJ+tXjY2bs1nzvD rA== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3rtptxcgf1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Fri, 14 Jul 2023 20:20:47 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Fri, 14 Jul 2023 20:20:45 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.48 via Frontend Transport; Fri, 14 Jul 2023 20:20:45 -0700 Received: from vpnclient.wrightpinski.org.com (unknown [10.76.242.112]) by maili.marvell.com (Postfix) with ESMTP id 41F5F5B693B; Fri, 14 Jul 2023 20:20:44 -0700 (PDT) From: Andrew Pinski To: CC: Andrew Pinski Subject: [PATCH 1/2] Add flow_sensitive_info_storage and use it in gimple-fold. Date: Fri, 14 Jul 2023 20:19:56 -0700 Message-ID: <20230715031957.1147225-1-apinski@marvell.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-GUID: dpqmjNS7XplvXKpqMFw9XROpAfEgl7jW X-Proofpoint-ORIG-GUID: dpqmjNS7XplvXKpqMFw9XROpAfEgl7jW X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.957,Hydra:6.0.591,FMLib:17.11.176.26 definitions=2023-07-14_12,2023-07-13_01,2023-05-22_02 X-Spam-Status: No, score=-14.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This adds flow_sensitive_info_storage and uses it in maybe_fold_comparisons_from_match_pd as mentioned in https://gcc.gnu.org/pipermail/gcc-patches/2023-June/621817.html . Since using it in maybe_fold_comparisons_from_match_pd was easy and allowed me to test the storage earlier, I did it. This also hides better how the flow sensitive information is stored and only a single place needs to be updated if that ever changes (again). OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions. gcc/ChangeLog: * gimple-fold.cc (fosa_unwind): Replace `vrange_storage *` with flow_sensitive_info_storage. (follow_outer_ssa_edges): Update how to save off the flow sensitive info. (maybe_fold_comparisons_from_match_pd): Update restoring of flow sensitive info. * tree-ssanames.cc (flow_sensitive_info_storage::save): New method. (flow_sensitive_info_storage::restore): New method. (flow_sensitive_info_storage::save_and_clear): New method. (flow_sensitive_info_storage::clear_storage): New method. * tree-ssanames.h (class flow_sensitive_info_storage): New class. --- gcc/gimple-fold.cc | 17 +++++------ gcc/tree-ssanames.cc | 72 ++++++++++++++++++++++++++++++++++++++++++++ gcc/tree-ssanames.h | 21 +++++++++++++ 3 files changed, 100 insertions(+), 10 deletions(-) diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc index 4027ff71e10..de94efbcff7 100644 --- a/gcc/gimple-fold.cc +++ b/gcc/gimple-fold.cc @@ -6947,7 +6947,7 @@ and_comparisons_1 (tree type, enum tree_code code1, tree op1a, tree op1b, } static basic_block fosa_bb; -static vec > *fosa_unwind; +static vec > *fosa_unwind; static tree follow_outer_ssa_edges (tree val) { @@ -6967,14 +6967,11 @@ follow_outer_ssa_edges (tree val) || POINTER_TYPE_P (TREE_TYPE (val))) && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (val))) return NULL_TREE; + flow_sensitive_info_storage storage; + storage.save_and_clear (val); /* If the definition does not dominate fosa_bb temporarily reset flow-sensitive info. */ - if (val->ssa_name.info.range_info) - { - fosa_unwind->safe_push (std::make_pair - (val, val->ssa_name.info.range_info)); - val->ssa_name.info.range_info = NULL; - } + fosa_unwind->safe_push (std::make_pair (val, storage)); return val; } return val; @@ -7034,14 +7031,14 @@ maybe_fold_comparisons_from_match_pd (tree type, enum tree_code code, type, gimple_assign_lhs (stmt1), gimple_assign_lhs (stmt2)); fosa_bb = outer_cond_bb; - auto_vec, 8> unwind_stack; + auto_vec, 8> unwind_stack; fosa_unwind = &unwind_stack; if (op.resimplify (NULL, (!outer_cond_bb ? follow_all_ssa_edges : follow_outer_ssa_edges))) { fosa_unwind = NULL; for (auto p : unwind_stack) - p.first->ssa_name.info.range_info = p.second; + p.second.restore (p.first); if (gimple_simplified_result_is_gimple_val (&op)) { tree res = op.ops[0]; @@ -7065,7 +7062,7 @@ maybe_fold_comparisons_from_match_pd (tree type, enum tree_code code, } fosa_unwind = NULL; for (auto p : unwind_stack) - p.first->ssa_name.info.range_info = p.second; + p.second.restore (p.first); return NULL_TREE; } diff --git a/gcc/tree-ssanames.cc b/gcc/tree-ssanames.cc index 5fdb6a37e9f..f81332451fc 100644 --- a/gcc/tree-ssanames.cc +++ b/gcc/tree-ssanames.cc @@ -916,3 +916,75 @@ make_pass_release_ssa_names (gcc::context *ctxt) { return new pass_release_ssa_names (ctxt); } + +/* Save and restore of flow sensitive information. */ + +/* Save off the flow sensitive info from NAME. */ + +void +flow_sensitive_info_storage::save (tree name) +{ + gcc_assert (state == 0); + if (!POINTER_TYPE_P (TREE_TYPE (name))) + { + range_info = SSA_NAME_RANGE_INFO (name); + state = 1; + return; + } + state = -1; + auto ptr_info = SSA_NAME_PTR_INFO (name); + if (ptr_info) + { + align = ptr_info->align; + misalign = ptr_info->misalign; + null = SSA_NAME_PTR_INFO (name)->pt.null; + } + else + { + align = 0; + misalign = 0; + null = true; + } +} + +/* Restore the flow sensitive info from NAME. */ + +void +flow_sensitive_info_storage::restore (tree name) +{ + gcc_assert (state != 0); + if (!POINTER_TYPE_P (TREE_TYPE (name))) + { + gcc_assert (state == 1); + SSA_NAME_RANGE_INFO (name) = range_info; + return; + } + gcc_assert (state == -1); + auto ptr_info = SSA_NAME_PTR_INFO (name); + /* If there was no flow sensitive info on the pointer + just return, there is nothing to restore to. */ + if (!ptr_info) + return; + if (align != 0) + set_ptr_info_alignment (ptr_info, align, misalign); + else + mark_ptr_info_alignment_unknown (ptr_info); + SSA_NAME_PTR_INFO (name)->pt.null = null; +} + +/* Save off the flow sensitive info from NAME. + And reset the flow sensitive info of NAME. */ + +void +flow_sensitive_info_storage::save_and_clear (tree name) +{ + save (name); + reset_flow_sensitive_info (name); +} + +/* Clear the storage. */ +void +flow_sensitive_info_storage::clear_storage (void) +{ + state = 0; +} diff --git a/gcc/tree-ssanames.h b/gcc/tree-ssanames.h index f3fa609208a..98f4a835483 100644 --- a/gcc/tree-ssanames.h +++ b/gcc/tree-ssanames.h @@ -136,5 +136,26 @@ make_temp_ssa_name (tree type, gimple *stmt, const char *name) return ssa_name; } +/* A class which is used to save/restore the flow sensitive information. */ +class flow_sensitive_info_storage +{ +public: + void save (tree); + void save_and_clear (tree); + void restore (tree); + void clear_storage (); +private: + /* 0 means there is nothing saved. + 1 means non pointer is saved. + -1 means a pointer type is saved. + -2 means a pointer type is saved but no information was saved. */ + int state = 0; + /* The range info for non pointers */ + vrange_storage *range_info = nullptr; + /* Flow sensitive pointer information. */ + unsigned int align = 0; + unsigned int misalign = 0; + bool null = true; +}; #endif /* GCC_TREE_SSANAMES_H */ -- 2.31.1