From patchwork Sat Feb 19 09:36:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Wei Liew X-Patchwork-Id: 51236 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 497973850400 for ; Sat, 19 Feb 2022 09:36:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 497973850400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1645263405; bh=zZqi4dBacOdBdJPHqsu1kzdaRGOFoXVxvh7GSmqmQak=; h=Subject:Date:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Fo+0svxLsoc2l9VTJJMeQBZV48tmxqReGeWHTQJUlwH8tBMaYDc+7PJ024ykkwloG FH5QzDimr1lbaWvAcBK/SENSilBscGPLZTeoq6RoUVLRIM7BWabrI2jZaerd/bfoyQ YvPV8aKK/wJG0HcyXqG1cdocfuKh2XjtjZinvOAg= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pg1-x536.google.com (mail-pg1-x536.google.com [IPv6:2607:f8b0:4864:20::536]) by sourceware.org (Postfix) with ESMTPS id CD4FD3858D1E for ; Sat, 19 Feb 2022 09:36:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CD4FD3858D1E Received: by mail-pg1-x536.google.com with SMTP id 132so9912108pga.5 for ; Sat, 19 Feb 2022 01:36:15 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:content-transfer-encoding:mime-version :subject:message-id:date:to; bh=zZqi4dBacOdBdJPHqsu1kzdaRGOFoXVxvh7GSmqmQak=; b=MN/6hqn2gXPuwI9Ffza432gId5hXoHLOusrTWooq8wNjZAP5XeUdEeFI3tDNedptSo bPGA6SsE6Un/AsA26rHRrE2H1hX1gQokoAI9p0AolbvELIEPlFS+hLSBzWsJtzFbWwIt OsIixSn3MG/xvuQENobIiKM07BUf3kg9NJNz1p/aa68v+N7vgR9nahPD+rB1jfuGvpFD gHpe8p1T8Nq54L3vdEFH7vmZr/AdE7kYB+1Sz7zX2KTy3gh83nOYv9JUY6B8rVpe5WVK L5EBPtIcI0VcSm2vF8wNHeCBqrE3HKVFvdqpZG+3WGYgklj9s0GRfiyCOFzlhMGrbmjd 9Z8Q== X-Gm-Message-State: AOAM532JrRrWh818HB8m4O9oaOd8j5UygFYpmALHcLK+/pDTglUo93NY vF4/+hDzCM8BCFgv5zLPg4c5ilq2hjToGA== X-Google-Smtp-Source: ABdhPJw4jePVm1QKSIHxl9UErngVtet/g0Pj2LUm92u1l/Mqznmahz9YojdHtef2IqZ62akU7rT/Dg== X-Received: by 2002:a65:6753:0:b0:363:f6c3:d2ad with SMTP id c19-20020a656753000000b00363f6c3d2admr9294353pgu.36.1645263374272; Sat, 19 Feb 2022 01:36:14 -0800 (PST) Received: from smtpclient.apple ([2401:7400:c807:233c:c02a:8a3e:419a:1059]) by smtp.gmail.com with ESMTPSA id b16sm5786368pfv.192.2022.02.19.01.36.12 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 19 Feb 2022 01:36:13 -0800 (PST) Mime-Version: 1.0 (Mac OS X Mail 15.0 \(3693.60.0.1.1\)) Subject: [PATCH] tree-optimization: [PR103855] Fold (type)X / (type)Y Message-Id: Date: Sat, 19 Feb 2022 17:36:11 +0800 To: GCC Patches X-Mailer: Apple Mail (2.3693.60.0.1.1) X-Spam-Status: No, score=-11.0 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, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Zhao Wei Liew via Gcc-patches From: Zhao Wei Liew Reply-To: Zhao Wei Liew Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" This pattern converts (trunc_div (convert a) (convert b)) to (convert (trunc_div a b)) when: 1. type, a, and b all have unsigned integeral types 2. a and b have the same type precision 3. type has type precision at least as larger as a and b This is useful as wider divisions are typically more expensive. To illustrate the effects, consider the following code snippet: unsigned long long f(unsigned int a, unsigned int b) { unsigned long long all = a; return all / b; } Without the pattern, g++ -std=c++20 -O2 generates the following assembly: f(unsigned int, unsigned int): mov eax, edi mov esi, esi xor edx, edx div rsi ret With the pattern, it generates this: f(unsigned int, unsigned int): mov eax, edi xor edx, edx div esi ret This is identical to what clang++ -std=c++20 -O2 generates. Signed-off-by: Zhao Wei Liew PR tree-optimization/103855 gcc/ChangeLog: * match.pd: Add pattern for (type)X / (type)Y. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/divide-8.c: New test. * gcc.dg/tree-ssa/divide-9.c: New test. --- gcc/match.pd | 15 +++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/divide-8.c | 9 +++++++++ gcc/testsuite/gcc.dg/tree-ssa/divide-9.c | 10 ++++++++++ 3 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/divide-8.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/divide-9.c diff --git a/gcc/match.pd b/gcc/match.pd index 10f62284862..393b43756dd 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -684,6 +684,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (if (INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type)) (convert (trunc_mod @0 @1)))) +/* (type)X / (type)Y -> (type)(X / Y) + when the resulting type is at least precise as the original types + and when all the types are unsigned integral types. */ +(simplify + (trunc_div (convert @0) (convert @1)) + (if (INTEGRAL_TYPE_P (type) + && INTEGRAL_TYPE_P (TREE_TYPE (@0)) + && INTEGRAL_TYPE_P (TREE_TYPE (@1)) + && TYPE_UNSIGNED (type) + && TYPE_UNSIGNED (TREE_TYPE (@0)) + && TYPE_UNSIGNED (TREE_TYPE (@1)) + && TYPE_PRECISION (TREE_TYPE (@0)) == TYPE_PRECISION (TREE_TYPE (@1)) + && TYPE_PRECISION (type) >= TYPE_PRECISION (TREE_TYPE (@0))) + (convert (trunc_div @0 @1)))) + /* x * (1 + y / x) - y -> x - y % x */ (simplify (minus (mult:cs @0 (plus:s (trunc_div:s @1 @0) integer_onep)) @1) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/divide-8.c b/gcc/testsuite/gcc.dg/tree-ssa/divide-8.c new file mode 100644 index 00000000000..489604c4eb6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/divide-8.c @@ -0,0 +1,9 @@ +/* PR tree-optimization/103855 */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +unsigned int f(unsigned int a, unsigned int b) { + unsigned long long all = a; + return all / b; +} + +/* { dg-final { scan-tree-dump-not "\(unsigned long long int)" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/divide-9.c b/gcc/testsuite/gcc.dg/tree-ssa/divide-9.c new file mode 100644 index 00000000000..3e75a49b509 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/divide-9.c @@ -0,0 +1,10 @@ +/* PR tree-optimization/103855 */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +unsigned long long f(unsigned int a, unsigned int b) { + unsigned long long all = a; + return all / b; +} + +/* { dg-final { scan-tree-dump-times "\\\(unsigned long long int\\\)" 1 "optimized" } } */ +