From: Andrew MacLeod <amacleod@redhat.com>
To: gcc-patches <gcc-patches@gcc.gnu.org>
Subject: [PATCH] PR tree-optimization/109238 - Ranger cache dominator queries should ignore backedges.
Date: Thu, 23 Mar 2023 14:37:01 -0400 [thread overview]
Message-ID: <96146be5-a7aa-23fb-0052-d2d81ff60c08@redhat.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1270 bytes --]
Detailed info in the PR.
As we walk the DOM tree to calculate ranges, any block with multiple
predecessors is processed by evaluating and unioning incoming values.
This catches more complex cases where the dominator node itself may not
carry range adjustments that we care about.
What was missing was the "quick check" doesn't propagate any info. If
the edge we check is dominated by this block (ie, its a back edge), then
no additional useful information can be provided as it just leads back
to where we currently are. Only edges which are not dominated by the
current block need be checked.
The issue arose because this "quick check" mechanism gives up on complex
cases and returns VARYING... so any backedge would union the real value
from the dominators with the failed result "VARYING" from that edge, and
we get VARYING instead of the correct result.
The patch simply checks if the current block dominates the predecessor
of an edge before launching the query.
Performance impact in negligible. slight slowdown for the check, slight
speedup by doing less work.. its a wash.
Bootstraps on x86_64-pc-linux-gnu with no regressions.
Ok for trunk?
Andrew
PS I have not managed to produce a reduced testcase yet.. If I do I will
supply it.
[-- Attachment #2: 238.diff --]
[-- Type: text/x-patch, Size: 1149 bytes --]
commit d54ae54c13276adbfc5b27227a3630ad40002705
Author: Andrew MacLeod <amacleod@redhat.com>
Date: Thu Mar 23 10:28:34 2023 -0400
Ranger cache dominator queries should ignore backedges.
When querying dominators for cache values, ignore back edges in
read-only mode.
PR tree-optimization/109238
* gimple-range-cache.cc (ranger_cache::resolve_dom): Ignore
predecessors which this block dominates.
diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc
index 7aa6a3698cd..96460ece8f4 100644
--- a/gcc/gimple-range-cache.cc
+++ b/gcc/gimple-range-cache.cc
@@ -1510,6 +1510,11 @@ ranger_cache::resolve_dom (vrange &r, tree name, basic_block bb)
Value_Range er (TREE_TYPE (name));
FOR_EACH_EDGE (e, ei, bb->preds)
{
+ // If the predecessor is dominated by this block, then there is a back
+ // edge, and won't provide anything useful. We'll actually end up with
+ // VARYING as we will not resolve this node.
+ if (dominated_by_p (CDI_DOMINATORS, e->src, bb))
+ continue;
edge_range (er, e, name, RFD_READ_ONLY);
r.union_ (er);
}
next reply other threads:[~2023-03-23 18:37 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-23 18:37 Andrew MacLeod [this message]
2023-03-23 19:10 ` Jakub Jelinek
2023-03-24 7:03 ` 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=96146be5-a7aa-23fb-0052-d2d81ff60c08@redhat.com \
--to=amacleod@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
/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).