Message ID | Y6RTdCmstcJUoFnU@tucnak |
---|---|
State | New |
Headers |
Return-Path: <gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org> 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 CA39A385B538 for <patchwork@sourceware.org>; Thu, 22 Dec 2022 12:54:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CA39A385B538 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1671713688; bh=I0xHIsqLQEZQTJ/uB/1MRC4os+na/8onvAYsjhqUs9I=; h=Date:To:Cc:Subject:References:In-Reply-To:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=E/vu/hOsnqksfu1iIVj/b4ypz/3u8c5opaWMqAy7+OXwvl7gH/0/SSlxvAJ2bh3Jr NXwW+Js3SY7Dm1CgoneHl4tFLvlWGaJTVqTQqtMmljH5NeZnHC9qhBSKJYhc5l6Uyj tnyCSfneC+juHqsN3Zyrw+IkWU9nhDu8ZQ8hlvb4= 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 [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id A84AC3858D1E for <gcc-patches@gcc.gnu.org>; Thu, 22 Dec 2022 12:54:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A84AC3858D1E Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-49-1vO2rUC9PQeMmR83PJvolQ-1; Thu, 22 Dec 2022 07:54:17 -0500 X-MC-Unique: 1vO2rUC9PQeMmR83PJvolQ-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3B1BF811E6E; Thu, 22 Dec 2022 12:54:17 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.195.114]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E238C40C2064; Thu, 22 Dec 2022 12:54:16 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 2BMCsEmP1197337 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Thu, 22 Dec 2022 13:54:14 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 2BMCsDjZ1197336; Thu, 22 Dec 2022 13:54:13 +0100 Date: Thu, 22 Dec 2022 13:54:12 +0100 To: Aldy Hernandez <aldyh@redhat.com> Cc: Richard Biener <rguenther@suse.de>, gcc-patches <gcc-patches@gcc.gnu.org>, Andrew MacLeod <amacleod@redhat.com> Subject: [PATCH] phiopt: Adjust instead of reset phires range Message-ID: <Y6RTdCmstcJUoFnU@tucnak> References: <Y6QxsdUy2S2w//u/@tucnak> <nycvar.YFH.7.77.849.2212221131400.5956@jbgna.fhfr.qr> <CAGm3qMXEi0jPpu_MBBHLha2DPjFE9av6RpN7-zGpcLfaro2Y5g@mail.gmail.com> MIME-Version: 1.0 In-Reply-To: <CAGm3qMXEi0jPpu_MBBHLha2DPjFE9av6RpN7-zGpcLfaro2Y5g@mail.gmail.com> X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="oX1MAcZB1Qz6IanU" Content-Disposition: inline X-Spam-Status: No, score=-3.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP 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.29 Precedence: list List-Id: Gcc-patches mailing list <gcc-patches.gcc.gnu.org> List-Unsubscribe: <https://gcc.gnu.org/mailman/options/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe> List-Archive: <https://gcc.gnu.org/pipermail/gcc-patches/> List-Post: <mailto:gcc-patches@gcc.gnu.org> List-Help: <mailto:gcc-patches-request@gcc.gnu.org?subject=help> List-Subscribe: <https://gcc.gnu.org/mailman/listinfo/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe> From: Jakub Jelinek via Gcc-patches <gcc-patches@gcc.gnu.org> Reply-To: Jakub Jelinek <jakub@redhat.com> Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" <gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org> |
Series |
phiopt: Adjust instead of reset phires range
|
|
Commit Message
Jakub Jelinek
Dec. 22, 2022, 12:54 p.m. UTC
On Thu, Dec 22, 2022 at 01:09:21PM +0100, Aldy Hernandez wrote: > INTEGER_CST singleton and > > union that into the SSA_NAMEs range and then do set_range_info > > with the altered range I guess. > > > > Note that set_range_info is an intersect operation. It should really be > called update_range_info. Up to now, there were no users that wanted to > clobber old ranges completely. Thanks. That would be then (I've committed the previous patch, also for reasons of backporting) following incremental patch. For the just committed testcase, it does the right thing, # RANGE [irange] int [-INF, -1][1, +INF] # iftmp.2_9 = PHI <iftmp.3_10(4), 8(5)> is before the range (using -fdump-tree-all-alias) and r below is [irange] int [-INF, -1][1, +INF], unioned with carg of 0 into VARYING. If I try attached testcase though (which just uses signed char d instead of int d to give more interesting range info), then I see: # RANGE [irange] int [-128, -1][1, 127] # iftmp.2_10 = PHI <iftmp.3_11(4), 8(5)> but strangely r I get from range_of_expr is [irange] int [-128, 127] rather than the expected [irange] int [-128, -1][1, 127]. Sure, it is later unioned with 0, so it doesn't change anything, but I wonder what is the difference. Note, this is before actually replacing the phi arg 8(5) with iftmp.3_11(5). At that point bb4 is: <bb 4> [local count: 966367640]: # RANGE [irange] int [-128, 127] # iftmp.3_11 = PHI <iftmp.3_15(3), 0(2)> if (iftmp.3_11 != 0) goto <bb 6>; [56.25%] else goto <bb 5>; [43.75%] and bb 5 is empty forwarder, so [-128, -1][1, 127] is actually correct. Either iftmp.3_11 is non-zero, then iftmp.2_10 is that value and its range, or it is zero and then iftmp.2_10 is 8, so [-128, -1][1, 127] U [8, 8], but more importantly SSA_NAME_RANGE_INFO should be at least according to what is printed be without 0. 2022-12-22 Jakub Jelinek <jakub@redhat.com> Aldy Hernandez <aldyh@redhat.com> * tree-ssa-phiopt.cc (value_replacement): Instead of resetting phires range info, union it with oarg. Jakub // PR tree-optimization/108166 // { dg-do run } bool a, b; signed char d; int c; const int & foo (const int &f, const int &g) { return !f ? f : g; } __attribute__((noipa)) void bar (int) { } int main () { c = foo (b, 0) > ((b ? d : b) ?: 8); a = b ? d : b; bar (a); if (a != 0) __builtin_abort (); }
Comments
On Thu, Dec 22, 2022 at 1:54 PM Jakub Jelinek <jakub@redhat.com> wrote: > > On Thu, Dec 22, 2022 at 01:09:21PM +0100, Aldy Hernandez wrote: > > INTEGER_CST singleton and > > > union that into the SSA_NAMEs range and then do set_range_info > > > with the altered range I guess. > > > > > > > Note that set_range_info is an intersect operation. It should really be > > called update_range_info. Up to now, there were no users that wanted to > > clobber old ranges completely. > > Thanks. > That would be then (I've committed the previous patch, also for reasons of > backporting) following incremental patch. > > For the just committed testcase, it does the right thing, > # RANGE [irange] int [-INF, -1][1, +INF] > # iftmp.2_9 = PHI <iftmp.3_10(4), 8(5)> > is before the range (using -fdump-tree-all-alias) and r below is > [irange] int [-INF, -1][1, +INF], > unioned with carg of 0 into VARYING. > If I try attached testcase though (which just uses signed char d instead of > int d to give more interesting range info), then I see: > # RANGE [irange] int [-128, -1][1, 127] > # iftmp.2_10 = PHI <iftmp.3_11(4), 8(5)> > but strangely r I get from range_of_expr is > [irange] int [-128, 127] > rather than the expected [irange] int [-128, -1][1, 127]. > Sure, it is later unioned with 0, so it doesn't change anything, but I > wonder what is the difference. Note, this is before actually replacing > the phi arg 8(5) with iftmp.3_11(5). > At that point bb4 is: > <bb 4> [local count: 966367640]: > # RANGE [irange] int [-128, 127] > # iftmp.3_11 = PHI <iftmp.3_15(3), 0(2)> > if (iftmp.3_11 != 0) > goto <bb 6>; [56.25%] > else > goto <bb 5>; [43.75%] > and bb 5 is empty forwarder, so [-128, -1][1, 127] is actually correct. > Either iftmp.3_11 is non-zero, then iftmp.2_10 is that value and its range, or > it is zero and then iftmp.2_10 is 8, so [-128, -1][1, 127] U [8, 8], but > more importantly SSA_NAME_RANGE_INFO should be at least according to what > is printed be without 0. > > 2022-12-22 Jakub Jelinek <jakub@redhat.com> > Aldy Hernandez <aldyh@redhat.com> > > * tree-ssa-phiopt.cc (value_replacement): Instead of resetting > phires range info, union it with oarg. > > --- gcc/tree-ssa-phiopt.cc.jj 2022-12-22 12:52:36.588469821 +0100 > +++ gcc/tree-ssa-phiopt.cc 2022-12-22 13:11:51.145060050 +0100 > @@ -1492,11 +1492,25 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, > break; > } > if (equal_p) > - /* After the optimization PHI result can have value > - which it couldn't have previously. > - We could instead of resetting it union the range > - info with oarg. */ > - reset_flow_sensitive_info (gimple_phi_result (phi)); > + { > + tree phires = gimple_phi_result (phi); > + if (SSA_NAME_RANGE_INFO (phires)) > + { > + /* After the optimization PHI result can have value > + which it couldn't have previously. */ > + value_range r; I haven't looked at your problem above, but have you tried using int_range_max (or even int_range<2>) instead of value_range above? value_range is deprecated and uses the legacy anti-range business, which has a really hard time representing complex ranges, as well as union/intersecting them. > + if (get_global_range_query ()->range_of_expr (r, phires, > + phi)) > + { > + int_range<2> tmp (carg, carg); > + r.union_ (tmp); Here you are taking the legacy value_range and unioning into it. That's bound to lose precision. Ideally you should use int_range_max for intermediate calculations. Then set_range_info() will take care of squishing things down into whatever we allow into a global range (I think it's a 6-sub range object ??). Note, that if "r" can contain non integer/pointers (i.e. floats), you should use: // Range of <TYPE>. Value_Range r (<TYPE>); The goal is for Value_Range to become value_range, and for it to be used for anything not explicitly an integer/pointer. Thus the camel case for this release. Aldy > + reset_flow_sensitive_info (phires); > + set_range_info (phires, r); > + } > + else > + reset_flow_sensitive_info (phires); > + } > + } > if (equal_p && MAY_HAVE_DEBUG_BIND_STMTS) > { > imm_use_iterator imm_iter; > > > Jakub
--- gcc/tree-ssa-phiopt.cc.jj 2022-12-22 12:52:36.588469821 +0100 +++ gcc/tree-ssa-phiopt.cc 2022-12-22 13:11:51.145060050 +0100 @@ -1492,11 +1492,25 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, break; } if (equal_p) - /* After the optimization PHI result can have value - which it couldn't have previously. - We could instead of resetting it union the range - info with oarg. */ - reset_flow_sensitive_info (gimple_phi_result (phi)); + { + tree phires = gimple_phi_result (phi); + if (SSA_NAME_RANGE_INFO (phires)) + { + /* After the optimization PHI result can have value + which it couldn't have previously. */ + value_range r; + if (get_global_range_query ()->range_of_expr (r, phires, + phi)) + { + int_range<2> tmp (carg, carg); + r.union_ (tmp); + reset_flow_sensitive_info (phires); + set_range_info (phires, r); + } + else + reset_flow_sensitive_info (phires); + } + } if (equal_p && MAY_HAVE_DEBUG_BIND_STMTS) { imm_use_iterator imm_iter;