From patchwork Fri Mar 5 04:48:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kito Cheng X-Patchwork-Id: 1447623 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=sifive.com header.i=@sifive.com header.a=rsa-sha256 header.s=google header.b=kYx4VSN5; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DsFd16Jybz9sVS for ; Fri, 5 Mar 2021 15:49:07 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 534153858018; Fri, 5 Mar 2021 04:49:02 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pf1-x42d.google.com (mail-pf1-x42d.google.com [IPv6:2607:f8b0:4864:20::42d]) by sourceware.org (Postfix) with ESMTPS id 940363858C27 for ; Fri, 5 Mar 2021 04:48:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 940363858C27 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=kito.cheng@sifive.com Received: by mail-pf1-x42d.google.com with SMTP id 192so1302406pfv.0 for ; Thu, 04 Mar 2021 20:48:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=oAKouFCu9+TmMrjqkrSmve3DP8cjjAjQ7AUFtP7TPT8=; b=kYx4VSN50VFkpnLxhoytH7dd23wGjz5dqVKvs/8hvs9LUthB53izQhwMuInLVT1tiw LUrPODYgIbQv0+PCg0BzVRxgAS20ySONyD1S1hxrLM07GR6fv8Hnz7qjdvllqG6AsT6f D34gnCa5XPO0GWutFe3Iz1XVT4jn+s5Qh7wVwHqAdqStpEvc9o+ooBTNXlWz7zuD7hzB 05yQ5p5Rr3tNV3wMmAnpJ1iPACIdt2OrISnRHjfO+8qZnx8S3hYZa7kBjYnMNTbfS4yE RZwQCCYLCcT0IuN5XFHIQSDSucU8vwFEVGvWdv2BK26PfHh79D96fj7uQGKQXYvkzkIX 7nWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=oAKouFCu9+TmMrjqkrSmve3DP8cjjAjQ7AUFtP7TPT8=; b=S0oERPMtZg3jLVYssfnXl2ENmyNhuqT4IHPeLsRRaqU20exthaWw4JfZUBbwz6Ee7F 8O61eSsXQMbdka7gMl7H5/IaROVc3qqsA1/HOS1vEwEcs10+nelUGDPHRp8AM7pL5jjg dq3TOGqoSVGdqcFhCauO9ssY7XKInbxadXco8uf3DQD9yl3d02mlKEix3jF3YAxrHHNj ZNnvJci44r9ng4SsC3E4qPUZ8IFLHtlfzBhZKh6EKG+q6eoPNl21HK50269PsVgWW1f0 42APKzNiJYw2pFNyTQW3/5bqM5EG4wRW3SOWsv3cM690YtC/wTT8y9Qo5GXvaz6Z7C/V OvqQ== X-Gm-Message-State: AOAM533VdnGDqiAM55qPM+PZMLUW9Va9AEIEeDRv26Fe/aSz4GlpiRw4 sHNf0QdnBHgPu5NIKyo/8Y1KUdv2xl1SJQ== X-Google-Smtp-Source: ABdhPJzgMmMnmHmy39Qw9pSo3e/1tNOfd8eB+LrsozH66NkeSSY/coIWddRGYHIDF7oSKHstVdz7Og== X-Received: by 2002:a62:1b53:0:b029:1ee:8ff8:c706 with SMTP id b80-20020a621b530000b02901ee8ff8c706mr6796031pfb.76.1614919735257; Thu, 04 Mar 2021 20:48:55 -0800 (PST) Received: from hsinchu02.internal.sifive.com (114-34-229-221.HINET-IP.hinet.net. [114.34.229.221]) by smtp.gmail.com with ESMTPSA id x7sm762199pjr.7.2021.03.04.20.48.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 20:48:54 -0800 (PST) From: Kito Cheng To: gcc-patches@gcc.gnu.org, kito.cheng@gmail.com, kito.cheng@sifive.com, jimw@sifive.com Subject: [PATCH] PR target/99314: Fix integer signedness issue for cpymem pattern expansion. Date: Fri, 5 Mar 2021 12:48:51 +0800 Message-Id: <20210305044851.87364-1-kito.cheng@sifive.com> X-Mailer: git-send-email 2.30.0 MIME-Version: 1.0 X-Spam-Status: No, score=-14.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: , Cc: Sinan Lin Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" From: Sinan Lin Third operand of cpymem pattern is unsigned HOST_WIDE_INT, however we are interpret that as signed HOST_WIDE_INT, that not a problem in most case, but when the value is large than signed HOST_WIDE_INT, it might screw up since we have using that value to calculate the buffer size. 2021-03-05 Sinan Lin Kito Cheng gcc/ChangeLog: * config/riscv/riscv.c (riscv_block_move_straight): Change type to unsigned HOST_WIDE_INT for parameter and local variable with HOST_WIDE_INT type. (riscv_adjust_block_mem): Ditto. (riscv_block_move_loop): Ditto. (riscv_expand_block_move): Ditto. --- gcc/config/riscv/riscv.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c index fffd0814eee..96fc0c0a4a0 100644 --- a/gcc/config/riscv/riscv.c +++ b/gcc/config/riscv/riscv.c @@ -3146,9 +3146,9 @@ riscv_legitimize_call_address (rtx addr) Assume that the areas do not overlap. */ static void -riscv_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length) +riscv_block_move_straight (rtx dest, rtx src, unsigned HOST_WIDE_INT length) { - HOST_WIDE_INT offset, delta; + unsigned HOST_WIDE_INT offset, delta; unsigned HOST_WIDE_INT bits; int i; enum machine_mode mode; @@ -3194,8 +3194,8 @@ riscv_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length) register. Store them in *LOOP_REG and *LOOP_MEM respectively. */ static void -riscv_adjust_block_mem (rtx mem, HOST_WIDE_INT length, - rtx *loop_reg, rtx *loop_mem) +riscv_adjust_block_mem (rtx mem, unsigned HOST_WIDE_INT length, + rtx *loop_reg, rtx *loop_mem) { *loop_reg = copy_addr_to_reg (XEXP (mem, 0)); @@ -3210,11 +3210,11 @@ riscv_adjust_block_mem (rtx mem, HOST_WIDE_INT length, the memory regions do not overlap. */ static void -riscv_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length, - HOST_WIDE_INT bytes_per_iter) +riscv_block_move_loop (rtx dest, rtx src, unsigned HOST_WIDE_INT length, + unsigned HOST_WIDE_INT bytes_per_iter) { rtx label, src_reg, dest_reg, final_src, test; - HOST_WIDE_INT leftover; + unsigned HOST_WIDE_INT leftover; leftover = length % bytes_per_iter; length -= leftover; @@ -3259,18 +3259,19 @@ riscv_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length, bool riscv_expand_block_move (rtx dest, rtx src, rtx length) { + unsigned HOST_WIDE_INT hwi_length = UINTVAL (length); if (CONST_INT_P (length)) { - HOST_WIDE_INT factor, align; + unsigned HOST_WIDE_INT factor, align; align = MIN (MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), BITS_PER_WORD); factor = BITS_PER_WORD / align; if (optimize_function_for_size_p (cfun) - && INTVAL (length) * factor * UNITS_PER_WORD > MOVE_RATIO (false)) + && hwi_length * factor * UNITS_PER_WORD > MOVE_RATIO (false)) return false; - if (INTVAL (length) <= RISCV_MAX_MOVE_BYTES_STRAIGHT / factor) + if (hwi_length <= (RISCV_MAX_MOVE_BYTES_STRAIGHT / factor)) { riscv_block_move_straight (dest, src, INTVAL (length)); return true; @@ -3280,7 +3281,8 @@ riscv_expand_block_move (rtx dest, rtx src, rtx length) unsigned min_iter_words = RISCV_MAX_MOVE_BYTES_PER_LOOP_ITER / UNITS_PER_WORD; unsigned iter_words = min_iter_words; - HOST_WIDE_INT bytes = INTVAL (length), words = bytes / UNITS_PER_WORD; + unsigned HOST_WIDE_INT bytes = hwi_length; + unsigned HOST_WIDE_INT words = bytes / UNITS_PER_WORD; /* Lengthen the loop body if it shortens the tail. */ for (unsigned i = min_iter_words; i < min_iter_words * 2 - 1; i++)