From patchwork Tue Jun 1 05:22:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hongtao Liu X-Patchwork-Id: 1485865 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=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=XSHJYyI+; dkim-atps=neutral Received: from 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 RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FvL6Y2Y4Wz9sSn for ; Tue, 1 Jun 2021 15:18:43 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 9557D38460A2; Tue, 1 Jun 2021 05:18:39 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9557D38460A2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1622524719; bh=9/wYQDor7RQ3U2VJCcD0o3CvVeQG4wjijxjCcgyHc8w=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=XSHJYyI+PRyEBvW7qWwYETHZ0MZQf55oBDvmUkhceztQW+o8o2jKxcK4iMm1k4a1S RdIa34SCs1TqOMu1U+cDVt2Kwvxi/hVWuyVJD/MoYv/Rel8fQgGZn9ZFrFDaIKehRw DgxIaELIiN5eMJQxbGlXCfX/M2l6wwBEsEfF+euo= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-vs1-xe32.google.com (mail-vs1-xe32.google.com [IPv6:2607:f8b0:4864:20::e32]) by sourceware.org (Postfix) with ESMTPS id D0E30384C003 for ; Tue, 1 Jun 2021 05:18:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D0E30384C003 Received: by mail-vs1-xe32.google.com with SMTP id x8so2369904vso.5 for ; Mon, 31 May 2021 22:18:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=9/wYQDor7RQ3U2VJCcD0o3CvVeQG4wjijxjCcgyHc8w=; b=lQkR0K2/C8zqoxoJDN3IWHfjsilUYB3z3kLHja2E/9V/1qOt5crAaJp0/WHb66iPvT CQwjE1dktspQ4+JQLNago+87XXfnTe0s2z02FO+69ivCqnjk0t+nNpv4UaEL4j2NKRgH XoFi9pD6g7HwC5yy1XKga1+NbJRxLZ60/LixA2EWxX9GgaUcJQs7I3mPCJqO4Z0K2WWi 46qurtqJHvcJXbIyZhPem4Bd4iyQFjHIYTKDDesLXcaYZVfDleTC6uc71ANqi1tgUf9Z E/ANKNVLX+AOcMpTNGvnU1EHVWf3OcVoRnlutbOcAPp7v90ilmWSlwO12AmzUR/cwB2t t/Zg== X-Gm-Message-State: AOAM533a0UTQ7MQgLCqpvMe3dewTgnP/9ySO7fYT/rI8qZb4USyVJ5hf L+a/zghOBWNCFS62Zlu7hvsnDadM3BLAz9GX434= X-Google-Smtp-Source: ABdhPJwDxmJ3PK4dMxHvClHXaUDX0SHKtCnOA5KlrObosC3CNQkzinQs0cvRQzlzvClG9xxyk0sR050UWEuv/jDOQoA= X-Received: by 2002:a67:c904:: with SMTP id w4mr16470802vsk.48.1622524715426; Mon, 31 May 2021 22:18:35 -0700 (PDT) MIME-Version: 1.0 Date: Tue, 1 Jun 2021 13:22:16 +0800 Message-ID: Subject: [PATCH] Simplify (view_convert ~a) < 0 to (view_convert a) >= 0 [PR middle-end/100738] To: Richard Biener , GCC Patches X-Spam-Status: No, score=-9.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, 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: , X-Patchwork-Original-From: Hongtao Liu via Gcc-patches From: Hongtao Liu Reply-To: Hongtao Liu Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Hi: This patch is about to simplify (view_convert:type ~a) < 0 to (view_convert:type a) >= 0 when type is signed integer. Similar for (view_convert:type ~a) >= 0. Bootstrapped and regtested on x86_64-linux-gnu{-m32,}. Ok for the trunk? gcc/ChangeLog: PR middle-end/100738 * match.pd ((view_convert ~a) < 0 --> (view_convert a) >= 0, (view_convert ~a) >= 0 --> (view_convert a) < 0): New GIMPLE simplification. gcc/testsuite/ChangeLog: PR middle-end/100738 * g++.target/i386/avx2-pr100738-1.C: New test. * g++.target/i386/sse4_1-pr100738-1.C: New test. From 8c13f61c25821aca63ef2920fddce9704bfadeec Mon Sep 17 00:00:00 2001 From: liuhongt Date: Thu, 27 May 2021 15:21:06 +0800 Subject: [PATCH] Optimize (view_convert:type ~a) < 0 to (view_convert:type a) >= 0 when type is signed integer. Similar for (view_convert:type ~a) >= 0. gcc/ChangeLog: PR middle-end/100738 * match.pd ((view_convert ~a) < 0 --> (view_convert a) >= 0, (view_convert ~a) >= 0 --> (view_convert a) < 0): New GIMPLE simplification. gcc/testsuite/ChangeLog: PR middle-end/100738 * g++.target/i386/avx2-pr100738-1.C: New test. * g++.target/i386/sse4_1-pr100738-1.C: New test. --- gcc/match.pd | 9 ++ .../g++.target/i386/avx2-pr100738-1.C | 120 ++++++++++++++++++ .../g++.target/i386/sse4_1-pr100738-1.C | 120 ++++++++++++++++++ 3 files changed, 249 insertions(+) create mode 100644 gcc/testsuite/g++.target/i386/avx2-pr100738-1.C create mode 100644 gcc/testsuite/g++.target/i386/sse4_1-pr100738-1.C diff --git a/gcc/match.pd b/gcc/match.pd index cdb87636951..d1c6b4ea2b4 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -3983,6 +3983,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) wide_int_to_tree (TREE_TYPE (cst), wi::to_wide (cst) - 1)); }))))) +/* ((view_convert:signed_type)~a) < 0 is just (view_convert) a >= 0. */ +(for cmp (lt ge) + acmp (ge lt) + (simplify + (cmp (view_convert (bit_not @0)) integer_zerop@1) + (if (!TYPE_UNSIGNED (TREE_TYPE (@1))) + (with { tree stype = TREE_TYPE (@1); } + (acmp (view_convert:stype @0) @1))))) + /* We can simplify a logical negation of a comparison to the inverted comparison. As we cannot compute an expression operator using invert_tree_comparison we have to simulate diff --git a/gcc/testsuite/g++.target/i386/avx2-pr100738-1.C b/gcc/testsuite/g++.target/i386/avx2-pr100738-1.C new file mode 100644 index 00000000000..80fdad3e5f0 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/avx2-pr100738-1.C @@ -0,0 +1,120 @@ +/* { dg-do compile } */ +/* { dg-options "-mavx2 -std=c++14 -O2 -mno-avx512f -mno-xop" } */ +/* { dg-final { scan-assembler-not "pxor" } } */ +/* { dg-final { scan-assembler-not "pcmpgt\[bdq]" } } */ +/* { dg-final { scan-assembler-times "pblendvb" 6 } } */ +/* { dg-final { scan-assembler-times "blendvps" 6 } } */ +/* { dg-final { scan-assembler-times "blendvpd" 6 } } */ + +typedef char v32qi __attribute__ ((vector_size (32))); +typedef short v16hi __attribute__ ((vector_size (32))); +typedef int v8si __attribute__ ((vector_size (32))); +typedef long long v4di __attribute__ ((vector_size (32))); + +v8si +f1 (v32qi a, v8si b, v8si c) +{ + return ((v8si)~a) < 0 ? b : c; +} + +v4di +f2 (v32qi a, v4di b, v4di c) +{ + return ((v4di)~a) < 0 ? b : c; +} + +v32qi +f3 (v16hi a, v32qi b, v32qi c) +{ + return ((v32qi)~a) < 0 ? b : c; +} + +v8si +f4 (v16hi a, v8si b, v8si c) +{ + return ((v8si)~a) < 0 ? b : c; +} + +v4di +f5 (v16hi a, v4di b, v4di c) +{ + return ((v4di)~a) < 0 ? b : c; +} + +v32qi +f6 (v8si a, v32qi b, v32qi c) +{ + return ((v32qi)~a) < 0 ? b : c; +} + +v4di +f7 (v8si a, v4di b, v4di c) +{ + return ((v4di)~a) < 0 ? b : c; +} + +v32qi +f8 (v4di a, v32qi b, v32qi c) +{ + return ((v32qi)~a) < 0 ? b : c; +} + +v8si +f9 (v4di a, v8si b, v8si c) +{ + return ((v8si)~a) < 0 ? b : c; +} + +v8si +f10 (v32qi a, v8si b, v8si c) +{ + return ((v8si)~a) >= 0 ? b : c; +} + +v4di +f11 (v32qi a, v4di b, v4di c) +{ + return ((v4di)~a) >= 0 ? b : c; +} + +v32qi +f12 (v16hi a, v32qi b, v32qi c) +{ + return ((v32qi)~a) >= 0 ? b : c; +} + +v8si +f13 (v16hi a, v8si b, v8si c) +{ + return ((v8si)~a) >= 0 ? b : c; +} + +v4di +f14 (v16hi a, v4di b, v4di c) +{ + return ((v4di)~a) >= 0 ? b : c; +} + +v32qi +f15 (v8si a, v32qi b, v32qi c) +{ + return ((v32qi)~a) >= 0 ? b : c; +} + +v4di +f16 (v8si a, v4di b, v4di c) +{ + return ((v4di)~a) >= 0 ? b : c; +} + +v32qi +f17 (v4di a, v32qi b, v32qi c) +{ + return ((v32qi)~a) >= 0 ? b : c; +} + +v8si +f18 (v4di a, v8si b, v8si c) +{ + return ((v8si)~a) >= 0 ? b : c; +} diff --git a/gcc/testsuite/g++.target/i386/sse4_1-pr100738-1.C b/gcc/testsuite/g++.target/i386/sse4_1-pr100738-1.C new file mode 100644 index 00000000000..d3454c264cd --- /dev/null +++ b/gcc/testsuite/g++.target/i386/sse4_1-pr100738-1.C @@ -0,0 +1,120 @@ +/* { dg-do compile } */ +/* { dg-options "-msse4 -std=c++14 -mno-avx2 -O2 -mno-xop" } */ +/* { dg-final { scan-assembler-not "pxor" } } */ +/* { dg-final { scan-assembler-not "pcmpgt\[bdq]" } } */ +/* { dg-final { scan-assembler-times "pblendvb" 6 } } */ +/* { dg-final { scan-assembler-times "blendvps" 6 } } */ +/* { dg-final { scan-assembler-times "blendvpd" 6 } } */ + +typedef char v16qi __attribute__ ((vector_size (16))); +typedef short v8hi __attribute__ ((vector_size (16))); +typedef int v4si __attribute__ ((vector_size (16))); +typedef long long v2di __attribute__ ((vector_size (16))); + +v4si +f1 (v16qi a, v4si b, v4si c) +{ + return ((v4si)~a) < 0 ? b : c; +} + +v2di +f2 (v16qi a, v2di b, v2di c) +{ + return ((v2di)~a) < 0 ? b : c; +} + +v16qi +f3 (v8hi a, v16qi b, v16qi c) +{ + return ((v16qi)~a) < 0 ? b : c; +} + +v4si +f4 (v8hi a, v4si b, v4si c) +{ + return ((v4si)~a) < 0 ? b : c; +} + +v2di +f5 (v8hi a, v2di b, v2di c) +{ + return ((v2di)~a) < 0 ? b : c; +} + +v16qi +f6 (v4si a, v16qi b, v16qi c) +{ + return ((v16qi)~a) < 0 ? b : c; +} + +v2di +f7 (v4si a, v2di b, v2di c) +{ + return ((v2di)~a) < 0 ? b : c; +} + +v16qi +f8 (v2di a, v16qi b, v16qi c) +{ + return ((v16qi)~a) < 0 ? b : c; +} + +v4si +f9 (v2di a, v4si b, v4si c) +{ + return ((v4si)~a) < 0 ? b : c; +} + +v4si +f10 (v16qi a, v4si b, v4si c) +{ + return ((v4si)~a) >= 0 ? b : c; +} + +v2di +f11 (v16qi a, v2di b, v2di c) +{ + return ((v2di)~a) >= 0 ? b : c; +} + +v16qi +f12 (v8hi a, v16qi b, v16qi c) +{ + return ((v16qi)~a) >= 0 ? b : c; +} + +v4si +f13 (v8hi a, v4si b, v4si c) +{ + return ((v4si)~a) >= 0 ? b : c; +} + +v2di +f14 (v8hi a, v2di b, v2di c) +{ + return ((v2di)~a) >= 0 ? b : c; +} + +v16qi +f15 (v4si a, v16qi b, v16qi c) +{ + return ((v16qi)~a) >= 0 ? b : c; +} + +v2di +f16 (v4si a, v2di b, v2di c) +{ + return ((v2di)~a) >= 0 ? b : c; +} + +v16qi +f17 (v2di a, v16qi b, v16qi c) +{ + return ((v16qi)~a) >= 0 ? b : c; +} + +v4si +f18 (v2di a, v4si b, v4si c) +{ + return ((v4si)~a) >= 0 ? b : c; +} -- 2.18.1