From patchwork Tue Oct 17 11:34:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lehua Ding X-Patchwork-Id: 154093 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2908:b0:403:3b70:6f57 with SMTP id ib8csp4068938vqb; Tue, 17 Oct 2023 04:37:19 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEaAchWkoy/wKGa8l2OrIiL38XrSZobL6LeIyQxbOyVAjcFi1dyvNaXsWTpJV5lS5VtKCfJ X-Received: by 2002:a05:6102:346:b0:457:c37d:5d4f with SMTP id e6-20020a056102034600b00457c37d5d4fmr1399411vsa.28.1697542639282; Tue, 17 Oct 2023 04:37:19 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1697542639; cv=pass; d=google.com; s=arc-20160816; b=L5QsVVovpRDuzp6+k0bp+YrRKyyRWczYYMpllyiF75XnT52oTv+5SXcnB5zMNF2NQp YCKmqYLVUf4T6IN0jrCRPPCJmaoszPpitn6b4atudb2AvdRqSEF6HFy7zWCRFs0ifYMJ DP853cDRIr0MsflpKa9k7jB5MZqIRj2d+yCg7kXAEgzATHlXng9kCwugp/0RFUVVwRvQ nuDAfwD8DWLG2sdCAAnGEWOwY/vXOAwFv2ktOZlfw5ROZaK/u1k0Irby0W0rQ9ncm7/k lLbw90wnRNugHiInmIN74UCxO5OaLTlc4CS/ePHP+2NYWczkMoWLlgPRAR9ysp11sQXd C53w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:feedback-id :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-filter:dmarc-filter :delivered-to; bh=kigwMPFCcMPzh8I0thJX7QkkndX8j5OPHHbWCl0EDzI=; fh=x/Q0OlwHuvCZ3FpkiZPiUSvevOYVxUAi4aNnf76mUPQ=; b=0D69K1cQxcoMyaEvU2mESRhhgo0/gY2N8NU7AbC/uAQSVVqx/U+dAasYrI6SMbE5LJ QfvPLFi//2Ql1Zb4PZl9MAfTq4dGJ2SSUYADgqt33W6+e+Cj0B0RJVl9/IuVb9863xcL E37msNKWTsMsFDjh8W4AFl0VGKhfzEmPrTj05kQlfgKm+6f/1UhoedRsmig8BOLvO1WJ /pMRUgR4+LyFa+USXutw6gTxcN3fasqZrH0bf20NgXs1zJjhAI79RlAuID6vN+Q0yhq3 M5P9adsk6tbHxAeupcR0jop/UrnnW0W+ViGX89r7hr4nZwgyfnQR4WPrTDgTa4F7gdeO jNnA== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1); 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" Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id w18-20020a05622a191200b00417b523872dsi945329qtc.621.2023.10.17.04.37.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Oct 2023 04:37:19 -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; arc=pass (i=1); 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" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C6A0D385CCBA for ; Tue, 17 Oct 2023 11:37:02 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtpbgau2.qq.com (smtpbgau2.qq.com [54.206.34.216]) by sourceware.org (Postfix) with ESMTPS id C6AAC3857355 for ; Tue, 17 Oct 2023 11:35:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C6AAC3857355 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivai.ai Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rivai.ai ARC-Filter: OpenARC Filter v1.0.0 sourceware.org C6AAC3857355 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=54.206.34.216 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697542532; cv=none; b=VR/wRusH6xF8AtHLDkutea4EX3ag9exWvhQUUztju5s7XpQ6THH53a2eL9y7sU854t+91GFXOSkU3qGZvuV6j217g3yozitCVWi/AdAqrit7UrEw+kL1xN7FqBel1cX6YQRnucp5SLXlmBjS1jKE3a4hUl/i6GyZswFrCQJ63Xw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697542532; c=relaxed/simple; bh=2YKNaXdn/JGc7CdzZ9tqGoSdf+Sf3oR1VT2wzm4olto=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=uuehw8MBCwD5UsIUCoHyYWMDpZPn1LXAol7TDnI4yTi8JJh4/k4invThxnrbsGDQ0KkIKCYN8iEOdt+/5ImVo//M2D54uGoDygZ8axFu1+OvcSEBIFbMfdVh7g9SfjlfV0rNWYvkTKuXD4JbUht/AvmGfjQojbMg/S0IyEQveAc= ARC-Authentication-Results: i=1; server2.sourceware.org X-QQ-mid: bizesmtp62t1697542523tg7h7wk6 Received: from rios-cad121.hadoop.rioslab.org ( [58.60.1.9]) by bizesmtp.qq.com (ESMTP) with id ; Tue, 17 Oct 2023 19:35:22 +0800 (CST) X-QQ-SSF: 01400000000000C0F000000A0000000 X-QQ-FEAT: D6RqbDSxuq6VCTIs8Vowy3MGT6xL3mQ7DGTximLxRF/vlEZGdKGhoKl5LUR9F QQachCqYPX7y1VPCwsufOhfHY3d5+riWOHS/RzlJ6toB+KR3LU6p2wULX5FBk6dgdPMNsj5 WTmm0kvx/hP7ZgBbL0kWT0ZyM9tcYZAfwNP8uasY8H29d1I0LZ/BPPEaWuEdj2eNwCT/QCc kjvdM5hjic/FtRLltN31QCOJhZ+cezJy++Ad3TwSJ9wKgW9vvUS0Hf40enYPIERmszGcurD Jk6yu2iOubxlcTtMScg/bVpbUpJB5ZAfSmhtgzc+qWc6o6SrrU8eJ6KYAkbuzH/UEdOJKui /GzEiRhxCHhh+qKq3ZvPKk8BY5LffDP0ReDVbuCTHpNcoLDVaOBZGltJc2gf8YpdCE22nHC dNe35Tm5Fzw= X-QQ-GoodBg: 2 X-BIZMAIL-ID: 1640549827222005283 From: Lehua Ding To: gcc-patches@gcc.gnu.org Cc: juzhe.zhong@rivai.ai, kito.cheng@gmail.com, rdapp.gcc@gmail.com, palmer@rivosinc.com, jeffreyalaw@gmail.com, lehua.ding@rivai.ai Subject: [PATCH V2 05/14] RISC-V: P5: combine phase 1 and 2 Date: Tue, 17 Oct 2023 19:34:51 +0800 Message-Id: <20231017113500.1160997-6-lehua.ding@rivai.ai> X-Mailer: git-send-email 2.36.3 In-Reply-To: <20231017113500.1160997-1-lehua.ding@rivai.ai> References: <20231017113500.1160997-1-lehua.ding@rivai.ai> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:rivai.ai:qybglogicsvrgz:qybglogicsvrgz6a-0 X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_NUMSUBJECT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780002470854707168 X-GMAIL-MSGID: 1780002470854707168 This sub-patch combine phase 1 and 2 to use the new demand system and delay the insert of vsetvl insn into phase 4. gcc/ChangeLog: * config/riscv/riscv-vsetvl.cc (pre_vsetvl::fuse_local_vsetvl_info): New. (pass_vsetvl::compute_local_backward_infos): Removed. (pass_vsetvl::need_vsetvl): Removed. (pass_vsetvl::transfer_before): Removed. (pass_vsetvl::transfer_after): Removed. (pass_vsetvl::emit_local_forward_vsetvls): Removed. --- gcc/config/riscv/riscv-vsetvl.cc | 269 ++++++++++++++----------------- 1 file changed, 123 insertions(+), 146 deletions(-) -- 2.36.3 diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc index 3f07fde782f..33bdcec04d8 100644 --- a/gcc/config/riscv/riscv-vsetvl.cc +++ b/gcc/config/riscv/riscv-vsetvl.cc @@ -2669,6 +2669,129 @@ public: } }; +void +pre_vsetvl::fuse_local_vsetvl_info () +{ + reg_def_loc + = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), GP_REG_LAST + 1); + bitmap_vector_clear (reg_def_loc, last_basic_block_for_fn (cfun)); + bitmap_ones (reg_def_loc[ENTRY_BLOCK_PTR_FOR_FN (cfun)->index]); + + for (bb_info *bb : crtl->ssa->bbs ()) + { + auto &block_info = get_block_info (bb); + block_info.m_bb = bb; + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, " Try fuse basic block %d\n", bb->index ()); + } + auto_vec infos; + for (insn_info *insn : bb->real_nondebug_insns ()) + { + vsetvl_info curr_info = vsetvl_info (insn); + if (curr_info.valid_p () || curr_info.unknown_p ()) + infos.safe_push (curr_info); + + /* Collecting GP registers modified by the current bb. */ + if (insn->is_real ()) + for (def_info *def : insn->defs ()) + if (def->is_reg () && GP_REG_P (def->regno ())) + bitmap_set_bit (reg_def_loc[bb->index ()], def->regno ()); + } + + vsetvl_info prev_info = vsetvl_info (); + prev_info.set_empty (); + for (auto &curr_info : infos) + { + if (prev_info.empty_p ()) + prev_info = curr_info; + else if ((curr_info.unknown_p () && prev_info.valid_p ()) + || (curr_info.valid_p () && prev_info.unknown_p ())) + { + block_info.infos.safe_push (prev_info); + prev_info = curr_info; + } + else if (curr_info.valid_p () && prev_info.valid_p ()) + { + if (dem.available_with (prev_info, curr_info)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, + " Ignore curr info since prev info " + "available with it:\n"); + fprintf (dump_file, " prev_info: "); + prev_info.dump (dump_file, " "); + fprintf (dump_file, " curr_info: "); + curr_info.dump (dump_file, " "); + fprintf (dump_file, "\n"); + } + if (!curr_info.use_by_non_rvv_insn_p () + && vsetvl_insn_p (curr_info.get_insn ()->rtl ())) + delete_list.safe_push (curr_info); + + if (curr_info.get_read_vl_insn ()) + prev_info.set_read_vl_insn (curr_info.get_read_vl_insn ()); + } + else if (dem.compatible_with (prev_info, curr_info)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, " Fuse curr info since prev info " + "compatible with it:\n"); + fprintf (dump_file, " prev_info: "); + prev_info.dump (dump_file, " "); + fprintf (dump_file, " curr_info: "); + curr_info.dump (dump_file, " "); + } + dem.merge_with (prev_info, curr_info); + if (curr_info.get_read_vl_insn ()) + prev_info.set_read_vl_insn (curr_info.get_read_vl_insn ()); + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, " prev_info after fused: "); + prev_info.dump (dump_file, " "); + fprintf (dump_file, "\n"); + } + } + else + { + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, + " Cannot fuse uncompatible infos:\n"); + fprintf (dump_file, " prev_info: "); + prev_info.dump (dump_file, " "); + fprintf (dump_file, " curr_info: "); + curr_info.dump (dump_file, " "); + } + block_info.infos.safe_push (prev_info); + prev_info = curr_info; + } + } + } + + if (prev_info.valid_p () || prev_info.unknown_p ()) + block_info.infos.safe_push (prev_info); + } + + avl_regs = sbitmap_alloc (GP_REG_LAST + 1); + bitmap_clear (avl_regs); + for (const bb_info *bb : crtl->ssa->bbs ()) + { + vsetvl_block_info &block_info = get_block_info (bb); + if (block_info.empty_p ()) + continue; + + vsetvl_info &header_info = block_info.get_header_info (); + if (header_info.valid_p () && header_info.has_reg_avl ()) + { + gcc_assert (GP_REG_P (REGNO (header_info.get_avl ()))); + bitmap_set_bit (avl_regs, REGNO (header_info.get_avl ())); + } + } +} + const pass_data pass_data_vsetvl = { RTL_PASS, /* type */ "vsetvl", /* name */ @@ -2801,152 +2924,6 @@ make_pass_vsetvl (gcc::context *ctxt) return new pass_vsetvl (ctxt); } -/* Compute demanded information by backward data-flow analysis. */ -void -pass_vsetvl::compute_local_backward_infos (const bb_info *bb) -{ - vector_insn_info change; - change.set_empty (); - - auto &block_info = m_vector_manager->vector_block_infos[bb->index ()]; - block_info.reaching_out = change; - - for (insn_info *insn : bb->reverse_real_nondebug_insns ()) - { - auto &info = get_vector_info (insn); - - if (info.uninit_p ()) - /* If it is uninitialized, propagate it directly. */ - update_vector_info (insn, change); - else if (info.unknown_p ()) - change = info; - else - { - gcc_assert (info.valid_p () && "Unexpected Invalid demanded info"); - if (change.valid_p ()) - { - if (!(propagate_avl_across_demands_p (change, info) - && !reg_available_p (insn, change)) - && change.compatible_p (info)) - { - update_vector_info (insn, change.local_merge (info)); - /* Fix PR109399, we should update user vsetvl instruction - if there is a change in demand fusion. */ - if (vsetvl_insn_p (insn->rtl ())) - change_vsetvl_insn (insn, info); - } - } - change = info; - } - } - - block_info.local_dem = change; - if (block_info.local_dem.empty_p ()) - block_info.reaching_out = block_info.local_dem; -} - -/* Return true if a dem_info is required to transition from curr_info to - require before INSN. */ -bool -pass_vsetvl::need_vsetvl (const vector_insn_info &require, - const vector_insn_info &curr_info) const -{ - if (!curr_info.valid_p () || curr_info.unknown_p () || curr_info.uninit_p ()) - return true; - - if (require.compatible_p (static_cast (curr_info))) - return false; - - return true; -} - -/* Given an incoming state reaching INSN, modifies that state so that it is - minimally compatible with INSN. The resulting state is guaranteed to be - semantically legal for INSN, but may not be the state requested by INSN. */ -void -pass_vsetvl::transfer_before (vector_insn_info &info, insn_info *insn) const -{ - if (!has_vtype_op (insn->rtl ())) - return; - - const vector_insn_info require = get_vector_info (insn); - if (info.valid_p () && !need_vsetvl (require, info)) - return; - info = require; -} - -/* Given a state with which we evaluated insn (see transfer_before above for why - this might be different that the state insn requested), modify the state to - reflect the changes insn might make. */ -void -pass_vsetvl::transfer_after (vector_insn_info &info, insn_info *insn) const -{ - if (vector_config_insn_p (insn->rtl ())) - { - info = get_vector_info (insn); - return; - } - - if (fault_first_load_p (insn->rtl ()) - && info.update_fault_first_load_avl (insn)) - return; - - /* If this is something that updates VL/VTYPE that we don't know about, set - the state to unknown. */ - if (insn->is_call () || insn->is_asm () - || find_access (insn->defs (), VL_REGNUM) - || find_access (insn->defs (), VTYPE_REGNUM)) - info = vector_insn_info::get_unknown (); -} - -/* Emit vsetvl within each block by forward data-flow analysis. */ -void -pass_vsetvl::emit_local_forward_vsetvls (const bb_info *bb) -{ - auto &block_info = m_vector_manager->vector_block_infos[bb->index ()]; - if (block_info.local_dem.empty_p ()) - return; - - vector_insn_info curr_info; - for (insn_info *insn : bb->real_nondebug_insns ()) - { - const vector_insn_info prev_info = curr_info; - enum vsetvl_type type = NUM_VSETVL_TYPE; - transfer_before (curr_info, insn); - - if (has_vtype_op (insn->rtl ())) - { - if (static_cast (prev_info) - != static_cast (curr_info)) - { - const auto require = get_vector_info (insn); - if (!require.compatible_p ( - static_cast (prev_info))) - type = insert_vsetvl (EMIT_BEFORE, insn->rtl (), require, - prev_info); - } - } - - /* Fix the issue of following sequence: - vsetivli zero, 5 - .... - vsetvli zero, zero - vmv.x.s (demand AVL = 8). - .... - incorrect: vsetvli zero, zero ===> Since the curr_info is AVL = 8. - correct: vsetivli zero, 8 - vadd (demand AVL = 8). */ - if (type == VSETVL_VTYPE_CHANGE_ONLY) - { - /* Update the curr_info to be real correct AVL. */ - curr_info.set_avl_info (prev_info.get_avl_info ()); - } - transfer_after (curr_info, insn); - } - - block_info.reaching_out = curr_info; -} - /* Assemble the candidates expressions for LCM. */ void pass_vsetvl::prune_expressions (void)