public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jakub Jelinek <jakub@redhat.com>
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
Date: Thu, 22 Dec 2022 13:54:12 +0100	[thread overview]
Message-ID: <Y6RTdCmstcJUoFnU@tucnak> (raw)
In-Reply-To: <CAGm3qMXEi0jPpu_MBBHLha2DPjFE9av6RpN7-zGpcLfaro2Y5g@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 3138 bytes --]

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;
+		      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;


	Jakub

[-- Attachment #2: pr108166-2.C --]
[-- Type: text/plain, Size: 318 bytes --]

// 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 ();
}

  reply	other threads:[~2022-12-22 12:54 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-22 10:30 [PATCH] phiopt: Drop SSA_NAME_RANGE_INFO in maybe equal case [PR108166] Jakub Jelinek
2022-12-22 11:13 ` Aldy Hernandez
2022-12-22 11:33 ` Richard Biener
2022-12-22 12:09   ` Aldy Hernandez
2022-12-22 12:54     ` Jakub Jelinek [this message]
2022-12-22 19:46       ` [PATCH] phiopt: Adjust instead of reset phires range Aldy Hernandez
2022-12-22 21:44         ` [PATCH] phiopt, v2: " Jakub Jelinek
2022-12-22 22:11           ` Aldy Hernandez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Y6RTdCmstcJUoFnU@tucnak \
    --to=jakub@redhat.com \
    --cc=aldyh@redhat.com \
    --cc=amacleod@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=rguenther@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).