From patchwork Tue Aug 13 02:34:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Li, Pan2" X-Patchwork-Id: 1971720 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=On+P3La2; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4Wjb8g283Cz1ybZ for ; Tue, 13 Aug 2024 12:35:30 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8E363385840A for ; Tue, 13 Aug 2024 02:35:28 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.11]) by sourceware.org (Postfix) with ESMTPS id 0C8133858D20 for ; Tue, 13 Aug 2024 02:35:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0C8133858D20 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0C8133858D20 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=192.198.163.11 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1723516509; cv=none; b=t32fktMCEhXyBB1JlvfAS8PrgXdJse+utu4T2rLNcMDwDZVz5TwT0iBgkEpyx8Rq2rpegb5yAsCTkpKVCcwQdsxyBnzYMTsjjUBk0TvC7LQtpNoSDh22FEMG1K6zfcjCV3hogOlr5levGkGPEznGT+Fk1WEAkIa0X6w4P57qziI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1723516509; c=relaxed/simple; bh=wct/P+IN3t61FHnUSXbm8iK2D2HnJAPS7H6/Go+yWRc=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=tASVXm0RRl5bAidJ31mh5+uQ4NvCarFAuroCMAIJWS17OPmORM2rLoD61Mpo+U3eEs87lppqOntzvRNmVUQFcszFvxOUcvEMShTcFzAdvtCLmTpduTImr5K4R14ID0pigDgIcFg7NW0Ti2X5EObt6p3AF0V6A5d2+LNKP1S2xj4= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1723516507; x=1755052507; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=wct/P+IN3t61FHnUSXbm8iK2D2HnJAPS7H6/Go+yWRc=; b=On+P3La2PhXC7ABerVhX65Lf1D7l+492aDsdmpuAqBaKeZxP2q/8ZcHI Y9zFLa2CroYyyrd2VStad1G9pWTu4BsZtbar4yFDW5UkPcLMuA0pLPp9q SmeKR045F0/t+C2Q3qP52ZDMFf4c0mv8L8jeP7bNnekwEERD0oGTM1Any n0zqKzMPKo89e7Ieyj/BKadeMAao4pKcuA/+fo0OuMjB0JGKnZx9F5tWn +hAVnTVX1fN2Xn5MNEXmHanmMsGU11mJiIXa6sqBfrXa3T40ZRcCdipZ0 Ro58PGccoVJmUzjoQvXgzN0TT70bztbdjO8AW+K3Uq4nDSf0bI7rO4zpN A==; X-CSE-ConnectionGUID: Rv/GvFQXS/eWucGpc9vbwQ== X-CSE-MsgGUID: uAf4uIFDSA+BuZeOcDpM9w== X-IronPort-AV: E=McAfee;i="6700,10204,11162"; a="32276395" X-IronPort-AV: E=Sophos;i="6.09,284,1716274800"; d="scan'208";a="32276395" Received: from orviesa010.jf.intel.com ([10.64.159.150]) by fmvoesa105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Aug 2024 19:35:05 -0700 X-CSE-ConnectionGUID: TzSd+m8wSQ6lGmIbcyCTFw== X-CSE-MsgGUID: 6zM50fm7RseZ+Pah5w2Nhg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.09,284,1716274800"; d="scan'208";a="58386583" Received: from shvmail03.sh.intel.com ([10.239.245.20]) by orviesa010.jf.intel.com with ESMTP; 12 Aug 2024 19:35:03 -0700 Received: from panli.sh.intel.com (panli.sh.intel.com [10.239.154.73]) by shvmail03.sh.intel.com (Postfix) with ESMTP id EED641005691; Tue, 13 Aug 2024 10:35:01 +0800 (CST) From: pan2.li@intel.com To: gcc-patches@gcc.gnu.org Cc: juzhe.zhong@rivai.ai, kito.cheng@gmail.com, jeffreyalaw@gmail.com, rdapp.gcc@gmail.com, Pan Li Subject: [PATCH v3] RISC-V: Make sure high bits of usadd operands is clean for HI/QI [PR116278] Date: Tue, 13 Aug 2024 10:34:46 +0800 Message-ID: <20240813023446.1452470-1-pan2.li@intel.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_NONE, SPF_NONE, 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-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~incoming=patchwork.ozlabs.org@gcc.gnu.org From: Pan Li For QI/HImode of .SAT_ADD, the operands may be sign-extended and the high bits of Xmode may be all 1 which is not expected. For example as below code. signed char b[1]; unsigned short c; signed char *d = b; int main() { b[0] = -40; c = ({ (unsigned short)d[0] < 0xFFF6 ? (unsigned short)d[0] : 0xFFF6; }) + 9; __builtin_printf("%d\n", c); } After expanding we have: ;; _6 = .SAT_ADD (_3, 9); (insn 8 7 9 (set (reg:DI 143) (high:DI (symbol_ref:DI ("d") [flags 0x86] ))) (nil)) (insn 9 8 10 (set (reg/f:DI 142) (mem/f/c:DI (lo_sum:DI (reg:DI 143) (symbol_ref:DI ("d") [flags 0x86] )) [1 d+0 S8 A64])) (nil)) (insn 10 9 11 (set (reg:HI 144 [ _3 ]) (sign_extend:HI (mem:QI (reg/f:DI 142) [0 *d.0_1+0 S1 A8]))) "test.c":7:10 -1 (nil)) The convert from signed char to unsigned short will have sign_extend rtl as above. And finally become the lb insn as below: lb a1,0(a5) // a1 is -40, aka 0xffffffffffffffd8 lui a0,0x1a addi a5,a1,9 slli a5,a5,0x30 srli a5,a5,0x30 // a5 is 65505 sltu a1,a5,a1 // compare 65505 and 0xffffffffffffffd8 => TRUE The sltu try to compare 65505 and 0xffffffffffffffd8 here, but we actually want to compare 65505 and 65496 (0xffd8). Thus we need to clean up the high bits to ensure this. The below test suites are passed for this patch: * The rv64gcv fully regression test. PR target/116278 gcc/ChangeLog: * config/riscv/riscv.cc (riscv_gen_zero_extend_rtx): Add new func impl to zero extend rtx. (riscv_expand_usadd): Leverage above func to cleanup operands and sum. gcc/testsuite/ChangeLog: * gcc.target/riscv/pr116278-run-1.c: New test. * gcc.target/riscv/pr116278-run-2.c: New test. Signed-off-by: Pan Li --- gcc/config/riscv/riscv.cc | 19 +++++++++++++++++- .../gcc.target/riscv/pr116278-run-1.c | 20 +++++++++++++++++++ .../gcc.target/riscv/pr116278-run-2.c | 20 +++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/riscv/pr116278-run-1.c create mode 100644 gcc/testsuite/gcc.target/riscv/pr116278-run-2.c diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index a1b09e865ea..9793166dc5b 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -11801,6 +11801,23 @@ riscv_get_raw_result_mode (int regno) return default_get_reg_raw_mode (regno); } +/* Generate a new rtx of Xmode based on the rtx and mode in define pattern. + The rtx x will be zero extended to Xmode if the mode is HI/QImode, and + the new zero extended Xmode rtx will be returned. + Or the gen_lowpart rtx of Xmode will be returned. */ + +static rtx +riscv_gen_zero_extend_rtx (rtx x, machine_mode mode) +{ + if (mode != HImode && mode != QImode) + return gen_lowpart (Xmode, x); + + rtx xmode_reg = gen_reg_rtx (Xmode); + riscv_emit_unary (ZERO_EXTEND, xmode_reg, x); + + return xmode_reg; +} + /* Implements the unsigned saturation add standard name usadd for int mode. z = SAT_ADD(x, y). @@ -11817,7 +11834,7 @@ riscv_expand_usadd (rtx dest, rtx x, rtx y) machine_mode mode = GET_MODE (dest); rtx xmode_sum = gen_reg_rtx (Xmode); rtx xmode_lt = gen_reg_rtx (Xmode); - rtx xmode_x = gen_lowpart (Xmode, x); + rtx xmode_x = riscv_gen_zero_extend_rtx (x, mode); rtx xmode_y = gen_lowpart (Xmode, y); rtx xmode_dest = gen_reg_rtx (Xmode); diff --git a/gcc/testsuite/gcc.target/riscv/pr116278-run-1.c b/gcc/testsuite/gcc.target/riscv/pr116278-run-1.c new file mode 100644 index 00000000000..d3812bdcdfb --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr116278-run-1.c @@ -0,0 +1,20 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-options "-O2 -fdump-rtl-expand-details" } */ + +#include + +int8_t b[1]; +int8_t *d = b; +int32_t c; + +int main() { + b[0] = -40; + uint16_t t = (uint16_t)d[0]; + + c = (t < 0xFFF6 ? t : 0xFFF6) + 9; + + if (c != 65505) + __builtin_abort (); +} + +/* { dg-final { scan-rtl-dump-times ".SAT_ADD " 2 "expand" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/pr116278-run-2.c b/gcc/testsuite/gcc.target/riscv/pr116278-run-2.c new file mode 100644 index 00000000000..669cd4f003f --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr116278-run-2.c @@ -0,0 +1,20 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-options "-O2 -fdump-rtl-expand-details" } */ + +#include + +int16_t b[1]; +int16_t *d = b; +int64_t c; + +int main() { + b[0] = -40; + uint32_t t = (uint32_t)d[0]; + + c = (t < 0xFFFFFFF6u ? t : 0xFFFFFFF6u) + 9; + + if (c != 4294967265) + __builtin_abort (); +} + +/* { dg-final { scan-rtl-dump-times ".SAT_ADD " 2 "expand" } } */