From patchwork Fri Jul 30 19:12:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew MacLeod X-Patchwork-Id: 1511771 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+incoming=patchwork.ozlabs.org@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=ptPHdFfM; dkim-atps=neutral Received: from sourceware.org (ip-8-43-85-97.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 4Gbxtg17NCz9sS8 for ; Sat, 31 Jul 2021 05:15:23 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D0A563857433 for ; Fri, 30 Jul 2021 19:15:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D0A563857433 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1627672520; bh=VMHq8hdeLiqfsgu3xNkYYx0r7ePpSli3maPcFqzZVWM=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=ptPHdFfMPFZ50ZHRZRGW3HX9s+MMJJZK/9kGFixuojb2wTCd3f7eG9iK/+IgwwuWI 1AwyzXsnTJSF73o/exmMB3trNG2fwlK9+uLTUDK6zLratow90dY3/af+WstxHpYoIT 0P/Drt/XtjdglM2EGmQVowcpFu1uW5M6L/bMIQ1c= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id 05FDF3858031 for ; Fri, 30 Jul 2021 19:13:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 05FDF3858031 Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-493-XxWY2iP-OrmBnIooyVEBAw-1; Fri, 30 Jul 2021 15:13:00 -0400 X-MC-Unique: XxWY2iP-OrmBnIooyVEBAw-1 Received: by mail-qv1-f69.google.com with SMTP id b6-20020a0cbf460000b02902dbb4e0a8f2so6648530qvj.6 for ; Fri, 30 Jul 2021 12:12:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:cc:from:subject:message-id:date:user-agent :mime-version:content-language; bh=VMHq8hdeLiqfsgu3xNkYYx0r7ePpSli3maPcFqzZVWM=; b=FZk8G1NCynSngp4ocBD8FdA6a+UGyZgzlyvaPooceaEDsVo7wMc6BwIZqEff/ZI0T6 lEx0TkA7+qh77S2dgxdP3V1gIvzYRp+z6X1jMJoUgzqVqV2m6URFyD+7jDhiSDQ+r8s5 twYzG5JT5BLN8VJaU+L20deKAhIGCTOa+41AHCv+VZfHDcwhYuzMRf5KzExnxKzMZ/dc /Kn1Wz7+2xtQEA/6/lQymqL3YaHU+VDtA7zOERXMK8RWSJCtYVsUws16eC+KInH9zl5Z 76qWhww4T3SUSiOMHD8PKVo2mfPKM8mCcucdxy0e4gV9ZtD3Pj5Vz95IWIv3283tpgpI HBMA== X-Gm-Message-State: AOAM5304iJ1M3C+KTPzBvyRpqsOZebt3k73T3UwY6q4eZMnp9VhqILXb X3ThQ4s38BYdnz+vDfsdT3CxXmL7KrUt8RAUeuji0dc4SehYszOus4sn/YZUH0PQq4jJSNTPVyw O2qA8xznSbPWo2ZmBVg== X-Received: by 2002:a0c:ea91:: with SMTP id d17mr4533261qvp.0.1627672379665; Fri, 30 Jul 2021 12:12:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxMxFfDhBmPLGZnrkPislOEnW6WOxj4RcTuy+7jDdeN3r+Z5jqkUpMp0wMus2XslqdmzETioQ== X-Received: by 2002:a0c:ea91:: with SMTP id d17mr4533251qvp.0.1627672379533; Fri, 30 Jul 2021 12:12:59 -0700 (PDT) Received: from [192.168.0.102] ([104.219.123.55]) by smtp.gmail.com with ESMTPSA id w26sm1303986qki.6.2021.07.30.12.12.58 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 30 Jul 2021 12:12:59 -0700 (PDT) To: gcc-patches Subject: [COMMITTED] Handle constants in wi_fold for trunc_mod. Message-ID: Date: Fri, 30 Jul 2021 15:12:57 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.12.0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-CA X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP 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: Andrew MacLeod via Gcc-patches From: Andrew MacLeod Reply-To: Andrew MacLeod Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" When resolving issues with divide by 0 returning UNDEFINED, I discovered that although we treat % 0 as undefined, the implementation of wi_fold for modulus doesn't expect constants, and with the earlier changes to wi_fold_in_parts, it can now get constants to calculate and combine. ie [10,10] % [4,4] was returning [0,3] instead of calculating the more precise  [2,2].  This patch fixes that, and I updated the testcase to incluide a more comprehensive test of modulus with constants. Bootstrapped on x86_64-pc-linux-gnu and powerpc64-unknown-linux-gnu with no regressions.  Pushed. Andrew From 145bc41dae7c7bfa093d61e77346f98e6a595a0e Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Thu, 29 Jul 2021 11:22:28 -0400 Subject: [PATCH 3/3] Handle constants in wi_fold for trunc_mod. Handle const % const, as wi_fold_in_parts may now provide this. Before this [10, 10] % [4, 4] would produce [0, 3] instead of [2, 2]. gcc/ * range-op.cc (operator_trunc_mod::wi_fold): Fold constants. gcc/testsuite/ * gcc.dg/tree-ssa/pr61839_2.c: Adjust. Add new const fold test. --- gcc/range-op.cc | 12 +++++++ gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c | 39 ++++++++++++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/gcc/range-op.cc b/gcc/range-op.cc index 69228882930..eb66e12677f 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -3240,6 +3240,18 @@ operator_trunc_mod::wi_fold (irange &r, tree type, return; } + // Check for constant and try to fold. + if (lh_lb == lh_ub && rh_lb == rh_ub) + { + wi::overflow_type ov = wi::OVF_NONE; + tmp = wi::mod_trunc (lh_lb, rh_lb, sign, &ov); + if (ov == wi::OVF_NONE) + { + r = int_range<2> (type, tmp, tmp); + return; + } + } + // ABS (A % B) < ABS (B) and either 0 <= A % B <= A or A <= A % B <= 0. new_ub = rh_ub - 1; if (sign == SIGNED) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c index f1b8feb4e9d..0e0f4c02113 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c @@ -45,9 +45,40 @@ int bar2 () return 0; } -/* Dont optimize 972195717 / 0 in function foo. */ +/* Ensure we are folding modulus sub-ranges properly. */ +__attribute__ ((noinline)) +int mod (int a, int b) +{ + int v1, v2; + v1 = (a < 10) ? 12 : 24; + v2 = (b > 20) ? 3 : 6; + + if (a > 20) + v1 = v1 * 2; + if (b > 20) + v2 = v2 * 2; + + if (a == b) + v2 = 0; + + /* v1 == 12, 24, or 48. v2 == 0, 3, 6, or 12. */ + int c = v1 % v2; + if (c == 0) + ; + else + __builtin_abort (); + return 0; +} + +/* EVRP now makes transformations in all functions, leaving a single + * builtin_abort call in bar2. */ +/* { dg-final { scan-tree-dump-times "__builtin_abort" 1 "evrp" } } */ + +/* Make sure to optimize 972195717 / 0 in function foo. */ /* { dg-final { scan-tree-dump-times "972195717 / " 0 "evrp" } } */ -/* Dont optimize 972195717 % 0 in function bar. */ -/* { dg-final { scan-tree-dump-times "972195717 % " 1 "evrp" } } */ -/* May optimize in function bar2, but EVRP doesn't perform this yet. */ +/* Make sure to optimize 972195717 % 0 in function bar. */ +/* { dg-final { scan-tree-dump-times "972195717 % " 0 "evrp" } } */ +/* Make sure to optimize 972195717 % [1,2] function bar2. */ /* { dg-final { scan-tree-dump-times "972195715 % " 0 "evrp" } } */ +/* [12,12][24,24][48,48] % [0,0][3,3][6,6][12,12] == [0,0] */ +/* { dg-final { scan-tree-dump-times "%" 0 "evrp" } } */ -- 2.17.2