public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Andrew MacLeod <amacleod@redhat.com>
To: Richard Biener <richard.guenther@gmail.com>
Cc: gcc-patches <gcc-patches@gcc.gnu.org>,
	"hernandez, aldy" <aldyh@redhat.com>
Subject: Re: [PATCH] PR tree-optimization/107570 - Reset SCEV after folding in VRP.
Date: Fri, 3 Feb 2023 10:54:23 -0500	[thread overview]
Message-ID: <b81a2fdf-1c27-2b3c-b570-d1404c1ebf97@redhat.com> (raw)
In-Reply-To: <CAFiYyc08JL2-CPxZvgbPEPAbPxknBXPWcd5r+5zQytQW5_7Xpg@mail.gmail.com>

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


On 2/2/23 07:22, Richard Biener wrote:
> On Wed, Feb 1, 2023 at 7:12 PM Andrew MacLeod via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
>> We can reset SCEV after we fold, then SCEVs cache shouldn't have
>> anything in it when we go to remove ssa-names in remove_unreachable().
>>
>> We were resetting it later sometimes if we were processing the array
>> bounds warning, so I removed that call and just always reset it now.
>>
>> Bootstraps on x86_64-pc-linux-gnu. Testing running. Assuming no
>> regressions,  OK for trunk?
> +
> +  // SCEV needs to be reset for array bounds, and we do not wish to trigger
> +  // any SCEV lookups when removing unreachable globals, so reset it here.
> +  scev_reset ();
>
> the comment suggests that SCEV queries (aka analyze_scalar_evolution)
> won't return anything after a scev_reset ().  That's not true - instead what
> it does is nuke the SCEV cache.  That's necessary when you
> release SSA names or alter the CFG and you want to avoid followup
> SCEV queries to pick up stale data.
>
> So if remove_and_update_globals performs SCEV queries and eventually
> releases SSA names you cannot remove the second call to scev_reset.
>
> But yes, it's probably substitute_and_fold_engine::substitute_and_fold
> itself that should do a
>
>    if (scev_initialized_p ())
>      scev_reset ();
>
> possibly only in the case it released an SSA name, or removed an
> edge (but that's maybe premature optimization).
>
> Richard.
>
>
Mmm, yeah thats not what I meant to imply.  We can simply reset it 
before trying to process the unreachable globals like so. Maybe we visit 
the  S&F engine next release.. It seems more intrusive than this.

How about this patch?  testing underway.

Andrew


[-- Attachment #2: 0001-Reset-SCEV-before-removing-unreachable-globals.patch --]
[-- Type: text/x-patch, Size: 1680 bytes --]

From e58ebd111e7b3b8047fb93396c204bd703926802 Mon Sep 17 00:00:00 2001
From: Andrew MacLeod <amacleod@redhat.com>
Date: Wed, 1 Feb 2023 11:46:18 -0500
Subject: [PATCH] Reset SCEV before removing unreachable globals.

SCEV should be reset in VRP before trying to remove unreachable globals
to avoid triggering issues with it's cache.

	PR tree-optimization/107570
	gcc/
	* tree-vrp.cc (remove_and_update_globals): Reset SCEV.

	gcc/testsuite/
	gcc.dg/pr107570.c: New.
---
 gcc/testsuite/gcc.dg/pr107570.c | 25 +++++++++++++++++++++++++
 gcc/tree-vrp.cc                 |  4 ++++
 2 files changed, 29 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/pr107570.c

diff --git a/gcc/testsuite/gcc.dg/pr107570.c b/gcc/testsuite/gcc.dg/pr107570.c
new file mode 100644
index 00000000000..ba5b535a867
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr107570.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+long int n;
+
+void
+foo (int *p, int x)
+{
+  for (;;)
+    {
+      for (*p = 0; *p < 1; ++*p)
+        {
+          n += *p < 0;
+          if (n < x)
+            {
+              while (x < 1)
+                ++x;
+
+              __builtin_unreachable ();
+            }
+        }
+
+      p = &x;
+    }
+}
diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc
index 3c431760a16..95547e5419b 100644
--- a/gcc/tree-vrp.cc
+++ b/gcc/tree-vrp.cc
@@ -121,6 +121,10 @@ remove_unreachable::remove_and_update_globals (bool final_p)
   if (m_list.length () == 0)
     return false;
 
+  // Ensure the cache in SCEV has been cleared before processing
+  // globals to be removed.
+  scev_reset ();
+
   bool change = false;
   tree name;
   unsigned i;
-- 
2.39.0


  reply	other threads:[~2023-02-03 15:54 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-01 18:11 Andrew MacLeod
2023-02-02 12:22 ` Richard Biener
2023-02-03 15:54   ` Andrew MacLeod [this message]
2023-02-03 18:47     ` Richard Biener

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=b81a2fdf-1c27-2b3c-b570-d1404c1ebf97@redhat.com \
    --to=amacleod@redhat.com \
    --cc=aldyh@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=richard.guenther@gmail.com \
    /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).