From patchwork Thu Oct 31 06:27:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Li, Pan2" X-Patchwork-Id: 2004542 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=mcda87jP; 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 4XfDd327PNz1xwF for ; Thu, 31 Oct 2024 17:30:14 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C23F3385772C for ; Thu, 31 Oct 2024 06:30:12 +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 [198.175.65.16]) by sourceware.org (Postfix) with ESMTPS id 21D4F3858D33 for ; Thu, 31 Oct 2024 06:29:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 21D4F3858D33 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 21D4F3858D33 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=198.175.65.16 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1730356181; cv=none; b=AZAPScWHioXmVAlWQLfwot8PEx0osbky/+OSwtutY2llu8OYnjaXM7hNHhrdV0v0BnYD72XoxsgWu4ERALkVT+/rNtzYns4XTNLL3WtCiGazBIORYpLQRjFqlxwoxmJNAfyb2eIM/9SUK+QamUuYozJTYf2VxtmrKO699KZHT7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1730356181; c=relaxed/simple; bh=b8axbXlXIOUiT2HRa3Yy2bBak41bd0mH8RgHYTMtd9c=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=MntEcnsbAfc1JQVHTb8YD8LOMSl7Kpzba/wOTDr+P6kHcgD+7S6UURpYX+S/eCwlLzQhOlbRdZ7Q1TzPTas5RINlfjzj8WCagcRyWWPo51esQPOfcYOSBUNAB5ANDyn42WrN7n3k913M8KdYXyorjQ1aVBgfTwgci5pr+Ej+ufY= 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=1730356179; x=1761892179; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=b8axbXlXIOUiT2HRa3Yy2bBak41bd0mH8RgHYTMtd9c=; b=mcda87jPoof70XAj/ROduy/HEosGCyQffwCPWiNaDw6tSc5AfkHEDmr1 4RjnrJx2v28nQySCCRJGKB4POUaDHqWXRdAZrKkXRFKyz2tilM/ediTAd P/4InneGZpCYxRJarW5P2OwEvz7ZeihOsLiQ8ZVxrAIbHPYrmThm+glfT l6vmVm98HPelWzSJgYJvFdMSEAOw4mMp4+zvr4lm12GGnnivHDbQuXPT3 Dstp4j35i7cY9NuqEXXBOJfXbU5Urj8eU7tmxxoPIrLm4kjU/Br8X8S3d zwjSPSytWifE38OEaiLBCaqpTC8f64IobQfYL9YDyVPlIC1LYXo5pxztX Q==; X-CSE-ConnectionGUID: cMQsuv+uQ8yUg9nNi3Razw== X-CSE-MsgGUID: 1XF2+yFhRByMwSNyhfhssA== X-IronPort-AV: E=McAfee;i="6700,10204,11222"; a="30238413" X-IronPort-AV: E=Sophos;i="6.11,199,1725346800"; d="scan'208";a="30238413" Received: from orviesa010.jf.intel.com ([10.64.159.150]) by orvoesa108.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Oct 2024 23:29:38 -0700 X-CSE-ConnectionGUID: fsM/5qk2RwGHL5uoySMagQ== X-CSE-MsgGUID: v6X2UL9xS/+If3Tudk9uAQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.11,247,1725346800"; d="scan'208";a="82454999" Received: from panli.sh.intel.com ([10.239.154.73]) by orviesa010.jf.intel.com with ESMTP; 30 Oct 2024 23:29:35 -0700 From: pan2.li@intel.com To: gcc-patches@gcc.gnu.org Cc: richard.guenther@gmail.com, Tamar.Christina@arm.com, juzhe.zhong@rivai.ai, kito.cheng@gmail.com, jeffreyalaw@gmail.com, rdapp.gcc@gmail.com, Pan Li Subject: [PATCH v2 01/10] Match: Simplify branch form 4 of unsigned SAT_ADD into branchless Date: Thu, 31 Oct 2024 14:27:33 +0800 Message-ID: <20241031062742.2709845-1-pan2.li@intel.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 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 There are sorts of forms for the unsigned SAT_ADD. Some of them are complicated while others are cheap. This patch would like to simplify the complicated form into the cheap ones. For example as below: From the form 4 (branch): SAT_U_ADD = (X + Y) < x ? -1 : (X + Y). To (branchless): SAT_U_ADD = (X + Y) | - ((X + Y) < X). #define T uint8_t T sat_add_u_1 (T x, T y) { return (T)(x + y) < x ? -1 : (x + y); } Before this patch: 1 │ uint8_t sat_add_u_1 (uint8_t x, uint8_t y) 2 │ { 3 │ uint8_t D.2809; 4 │ 5 │ _1 = x + y; 6 │ if (x <= _1) goto ; else goto ; 7 │ : 8 │ D.2809 = x + y; 9 │ goto ; 10 │ : 11 │ D.2809 = 255; 12 │ : 13 │ return D.2809; 14 │ } After this patch: 1 │ uint8_t sat_add_u_1 (uint8_t x, uint8_t y) 2 │ { 3 │ uint8_t D.2809; 4 │ 5 │ _1 = x + y; 6 │ _2 = x + y; 7 │ _3 = x > _2; 8 │ _4 = (unsigned char) _3; 9 │ _5 = -_4; 10 │ D.2809 = _1 | _5; 11 │ return D.2809; 12 │ } The below test suites are passed for this patch. * The rv64gcv fully regression test. * The x86 bootstrap test. * The x86 fully regression test. gcc/ChangeLog: * match.pd: Remove unsigned branch form 4 for SAT_ADD, and add simplify to branchless instead. gcc/testsuite/ChangeLog: * gcc.dg/sat_arith_simplify.h: New test. * gcc.dg/sat_u_add-simplify-2-u16.c: New test. * gcc.dg/sat_u_add-simplify-2-u32.c: New test. * gcc.dg/sat_u_add-simplify-2-u64.c: New test. * gcc.dg/sat_u_add-simplify-2-u8.c: New test. Signed-off-by: Pan Li --- gcc/match.pd | 23 +++++++++---------- gcc/testsuite/gcc.dg/sat_arith_simplify.h | 10 ++++++++ .../gcc.dg/sat_u_add-simplify-2-u16.c | 11 +++++++++ .../gcc.dg/sat_u_add-simplify-2-u32.c | 11 +++++++++ .../gcc.dg/sat_u_add-simplify-2-u64.c | 11 +++++++++ .../gcc.dg/sat_u_add-simplify-2-u8.c | 11 +++++++++ 6 files changed, 65 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/sat_arith_simplify.h create mode 100644 gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u16.c create mode 100644 gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u32.c create mode 100644 gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u64.c create mode 100644 gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u8.c diff --git a/gcc/match.pd b/gcc/match.pd index c851ac56e37..8425d7c4f20 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -3146,18 +3146,17 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (match (unsigned_integer_sat_add @0 @1) (bit_ior:c (usadd_left_part_2 @0 @1) (usadd_right_part_2 @0 @1))) -/* Simplify SAT_U_ADD to the cheap form - From: SAT_U_ADD = (X + Y) >= x ? (X + Y) : -1. - To: SAT_U_ADD = (X + Y) | - ((X + Y) < X). */ -(simplify (cond (ge (plus:c@2 @0 @1) @0) @2 integer_minus_onep) - (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type) - && types_match (type, @0, @1)) - (bit_ior @2 (negate (convert (lt @2 @0)))))) - -/* Unsigned saturation add, case 4 (branch with lt): - SAT_U_ADD = (X + Y) < x ? -1 : (X + Y). */ -(match (unsigned_integer_sat_add @0 @1) - (cond^ (lt (usadd_left_part_1@2 @0 @1) @0) integer_minus_onep @2)) +/* Simplify sorts of SAT_U_ADD forms to the cheap one. + The cheap form: SAT_U_ADD = (X + Y) | - ((X + Y) < X). */ +(if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)) + /* From SAT_U_ADD = (X + Y) >= x ? (X + Y) : -1. */ + (simplify (cond (ge (plus:c@2 @0 @1) @0) @2 integer_minus_onep) + (if (types_match (type, @0, @1)) + (bit_ior (plus@2 @0 @1) (negate (convert (lt @2 @0)))))) + /* From SAT_U_ADD = (X + Y) < x ? -1 : (X + Y). */ + (simplify (cond (lt (plus:c@2 @0 @1) @0) integer_minus_onep @2) + (if (types_match (type, @0, @1)) + (bit_ior (plus@2 @0 @1) (negate (convert (lt @2 @0))))))) /* Unsigned saturation add, case 5 (branch with eq .ADD_OVERFLOW): SAT_U_ADD = REALPART_EXPR <.ADD_OVERFLOW> == 0 ? .ADD_OVERFLOW : -1. */ diff --git a/gcc/testsuite/gcc.dg/sat_arith_simplify.h b/gcc/testsuite/gcc.dg/sat_arith_simplify.h new file mode 100644 index 00000000000..46ac00426b2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/sat_arith_simplify.h @@ -0,0 +1,10 @@ +#ifndef HAVE_DEFINED_SAT_ARITH_SIMPLIFY_H +#define HAVE_DEFINED_SAT_ARITH_SIMPLIFY_H + +#define DEF_SAT_U_ADD_2(T) \ +T sat_u_add_##T##_2 (T x, T y) \ +{ \ + return (T)(x + y) < x ? -1 : (x + y); \ +} + +#endif diff --git a/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u16.c b/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u16.c new file mode 100644 index 00000000000..b170b35096c --- /dev/null +++ b/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u16.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-gimple-details" } */ + +#include +#include "sat_arith_simplify.h" + +DEF_SAT_U_ADD_2 (uint16_t) + +/* { dg-final { scan-tree-dump-not " if " "gimple" } } */ +/* { dg-final { scan-tree-dump-not " else " "gimple" } } */ +/* { dg-final { scan-tree-dump-not " goto " "gimple" } } */ diff --git a/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u32.c b/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u32.c new file mode 100644 index 00000000000..8830ed7b878 --- /dev/null +++ b/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u32.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-gimple-details" } */ + +#include +#include "sat_arith_simplify.h" + +DEF_SAT_U_ADD_2 (uint32_t) + +/* { dg-final { scan-tree-dump-not " if " "gimple" } } */ +/* { dg-final { scan-tree-dump-not " else " "gimple" } } */ +/* { dg-final { scan-tree-dump-not " goto " "gimple" } } */ diff --git a/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u64.c b/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u64.c new file mode 100644 index 00000000000..76c4d4bddaa --- /dev/null +++ b/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u64.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-gimple-details" } */ + +#include +#include "sat_arith_simplify.h" + +DEF_SAT_U_ADD_2 (uint64_t) + +/* { dg-final { scan-tree-dump-not " if " "gimple" } } */ +/* { dg-final { scan-tree-dump-not " else " "gimple" } } */ +/* { dg-final { scan-tree-dump-not " goto " "gimple" } } */ diff --git a/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u8.c b/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u8.c new file mode 100644 index 00000000000..b034b8eedb1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/sat_u_add-simplify-2-u8.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-gimple-details" } */ + +#include +#include "sat_arith_simplify.h" + +DEF_SAT_U_ADD_2 (uint8_t) + +/* { dg-final { scan-tree-dump-not " if " "gimple" } } */ +/* { dg-final { scan-tree-dump-not " else " "gimple" } } */ +/* { dg-final { scan-tree-dump-not " goto " "gimple" } } */