From patchwork Wed Jul 12 20:59:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jivan Hakobyan X-Patchwork-Id: 119333 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp1410851vqm; Wed, 12 Jul 2023 14:00:32 -0700 (PDT) X-Google-Smtp-Source: APBJJlE17gS9ypxznlnt1Z7Hw2UY0AnDRkBtNVpyQGOhFtoNKetiMsD+e9d3UaQh4o5NQWE2hrds X-Received: by 2002:a05:6402:b27:b0:51e:54ad:ba8f with SMTP id bo7-20020a0564020b2700b0051e54adba8fmr14727699edb.24.1689195631632; Wed, 12 Jul 2023 14:00:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689195631; cv=none; d=google.com; s=arc-20160816; b=iUEQd/0q1DP8QS7WjZMB3vMi7x82qx33Aia8oj3oIBtTAszkMtZtNibDGhUhHEnRUg RQXvJvl7PYHk5qREUDH/P3Kk/u2ojiLi0uVOEYjOkpfO21Zo4Tu3osKG7ns1+nBQPret U0ifVyuqA1fP9EhNcBPN1JJR7vc3e9P2OtLSOD6sk3G6WpYshnliGDjbBwovoBd/tZRl WZPSvfrbu8op8mT8Kz0+gX/2KcmVMrBsu37hZoFpTGMEx/3VxSCOq905Zzgg7Qoe8z1f S36crWaTAcLqg9xPGEAHdhc2/VRtKWDviOPer9YrWqbVG/BsNfXpex5iH9RF2pPmZbbe 1Mnw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:to:subject :message-id:date:mime-version:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=uZdK1A2gnWWH9Ftg8iForEYocBuWcwVdJXN3eFeA8sA=; fh=UuFh9kRxswVH/PGOSrQb+b35qfeCoA2acCsNE8aSOSU=; b=o8ht7EffyHBRTQmqCb+5XTWWipp+PnAQIufhks95/eo6TrofBAJvQ5tARIhT4T0dwB JV2JKVN8fmoM6EgZ9xzc4KhB0sFdCbVIGNmslaYoR5pRYFSaxhTG8ebdIVoIlr29scaF ehEXc79oGZ+JnJ7fF8PFMXWUHqUVx+rMbvm3OnFsQUtvnWt49mIIq62RT0GpYW6tSccN XFLHc86M/BhX1TGFGOfi9sCAgLr9XZJQv6MkBvRedlqqwIMhIce3D9OyLKJk88eR6RyU EveDLcskrYZN0+5Zv9oiygOdirah4IU+0rJKstvA/mqCOssmb9/w+A1j3n/+GaSGrv9C 6kog== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=NajOBJgi; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 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 (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id f23-20020a05640214d700b00518c6e070f8si5517527edx.663.2023.07.12.14.00.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Jul 2023 14:00:31 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=NajOBJgi; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 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 675543858C1F for ; Wed, 12 Jul 2023 21:00:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 675543858C1F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1689195630; bh=uZdK1A2gnWWH9Ftg8iForEYocBuWcwVdJXN3eFeA8sA=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=NajOBJgiM1TVi27wEWPoYIH7ZXeNuE95v/ahE9NDLGnOwaWDhKv4FcoJFtuWyu0ql /zLlKx4K3yt5nnHo5H6t41jNxe+SCs2FQ38tqnNOAxk8PEGLkhMAs/9PyemJ4VfyIW P66OBzsImodhT1TCb7BpkUbcXocdDStdpvh7oMR4= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by sourceware.org (Postfix) with ESMTPS id 1E91C3858D20 for ; Wed, 12 Jul 2023 20:59:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1E91C3858D20 Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-1b9e9765f2cso55565ad.3 for ; Wed, 12 Jul 2023 13:59:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689195587; x=1691787587; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=vQhjluOdh1kUbmPcO/LT+ySJ0MhuUTRGJLHr0XB9mWg=; b=dBh4vwTEKeRVDfux0aHGlxfl7NWys1dZwgiaJ17LfISazmYrZMkgcnG//OifZXXkJV JCrlYOHAvBPFCB8mIWdPBN5mEZ9dVq1E8skXNgA073A9+yS73AhjHQwtjGDDIrEkqrFm NEoYG1maMSk28DRNCXBfU+OJh1nCmkyp/2V4H0+fJSzhW9qO4cJYHC6+d0bKsDagbx5C FQLyw/3EsZkK798PFnsllJdwLD8Zwni3s80bJ08wy4KghKZYbeA8Y9+VNilpLitzzZxA vDtoIuLp5zMZhtI8zYxzVgywQgVyiPnxrRqqMfhro/z8QXRthU0alJggZAxQOLqsKTfT WeXQ== X-Gm-Message-State: ABy/qLZxRfq0WlSonxobZFJhBV7Z7q80G4fs7EyOUfbw6saXWidexbD5 txl59C0BsFJmUU3ccPzSUVHmZ0janB719l4qLZfl0+ezoLQ= X-Received: by 2002:a17:903:2443:b0:1b8:a6b8:a400 with SMTP id l3-20020a170903244300b001b8a6b8a400mr19874743pls.67.1689195586821; Wed, 12 Jul 2023 13:59:46 -0700 (PDT) MIME-Version: 1.0 Date: Thu, 13 Jul 2023 00:59:30 +0400 Message-ID: Subject: RISC-V: Folding memory for FP + constant case To: gcc-patches@gcc.gnu.org X-Spam-Status: No, score=-8.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, HTML_MESSAGE, RCVD_IN_DNSWL_NONE, 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 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 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: Jivan Hakobyan via Gcc-patches From: Jivan Hakobyan Reply-To: Jivan Hakobyan Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771249998523435486 X-GMAIL-MSGID: 1771249998523435486 Accessing local arrays element turned into load form (fp + (index << C1)) + C2 address. In the case when access is in the loop we got loop invariant computation. For some reason, moving out that part cannot be done in loop-invariant passes. But we can handle that in target-specific hook (legitimize_address). That provides an opportunity to rewrite memory access more suitable for the target architecture. This patch solves the mentioned case by rewriting mentioned case to ((fp + C2) + (index << C1)) I have evaluated it on SPEC2017 and got an improvement on leela (over 7b instructions, .39% of the dynamic count) and dwarfs the regression for gcc (14m instructions, .0012% of the dynamic count). gcc/ChangeLog: * config/riscv/riscv.cc (riscv_legitimize_address): Handle folding. (mem_shadd_or_shadd_rtx_p): New predicate. diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index e4dc8115e696ed44affe6ee8b51d635fe0eaaa33..2a7e464b855ec45f1fce4daec36d84842f3f3ea4 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -1754,6 +1754,22 @@ riscv_shorten_lw_offset (rtx base, HOST_WIDE_INT offset) return addr; } +/* Helper for riscv_legitimize_address. Given X, return true if it + is a left shift by 1, 2 or 3 positions or a multiply by 2, 4 or 8. + + This respectively represent canonical shift-add rtxs or scaled + memory addresses. */ +static bool +mem_shadd_or_shadd_rtx_p (rtx x) +{ + return ((GET_CODE (x) == ASHIFT + || GET_CODE (x) == MULT) + && GET_CODE (XEXP (x, 1)) == CONST_INT + && ((GET_CODE (x) == ASHIFT && IN_RANGE (INTVAL (XEXP (x, 1)), 1, 3)) + || (GET_CODE (x) == MULT + && IN_RANGE (exact_log2 (INTVAL (XEXP (x, 1))), 1, 3)))); +} + /* This function is used to implement LEGITIMIZE_ADDRESS. If X can be legitimized in a way that the generic machinery might not expect, return a new address, otherwise return NULL. MODE is the mode of @@ -1779,6 +1795,33 @@ riscv_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, rtx base = XEXP (x, 0); HOST_WIDE_INT offset = INTVAL (XEXP (x, 1)); + /* Handle (plus (plus (mult (a) (mem_shadd_constant)) (fp)) (C)) case. */ + if (GET_CODE (base) == PLUS && mem_shadd_or_shadd_rtx_p (XEXP (base, 0)) + && SMALL_OPERAND (offset)) + { + + rtx index = XEXP (base, 0); + rtx fp = XEXP (base, 1); + if (REGNO (fp) == VIRTUAL_STACK_VARS_REGNUM) + { + + /* If we were given a MULT, we must fix the constant + as we're going to create the ASHIFT form. */ + int shift_val = INTVAL (XEXP (index, 1)); + if (GET_CODE (index) == MULT) + shift_val = exact_log2 (shift_val); + + rtx reg1 = gen_reg_rtx (Pmode); + rtx reg2 = gen_reg_rtx (Pmode); + rtx reg3 = gen_reg_rtx (Pmode); + riscv_emit_binary (PLUS, reg1, fp, GEN_INT (offset)); + riscv_emit_binary (ASHIFT, reg2, XEXP (index, 0), GEN_INT (shift_val)); + riscv_emit_binary (PLUS, reg3, reg2, reg1); + + return reg3; + } + } + if (!riscv_valid_base_register_p (base, mode, false)) base = copy_to_mode_reg (Pmode, base); if (optimize_function_for_size_p (cfun)