C++: Share indirect dataflow nodes across CopyValue instructions#18955
Merged
MathiasVP merged 2 commits intogithub:mainfrom Mar 10, 2025
Merged
Conversation
Contributor
There was a problem hiding this comment.
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
Tip: Copilot only keeps its highest confidence comments to reduce noise and keep you focused. Learn more
jketema
approved these changes
Mar 10, 2025
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intuitively, C++ has (at least) the following dataflow nodes:
Because many of these nodes semantically represent the same concept we merge some of these into a single dataflow node tuple. This has two benefits:
For example, for IR such as:
there will be a single dataflow node representing both the instruction
r1and the operand&:r1. That is, operands and instruction often share the same underlying IPA tuple (when the instruction has a unique use).Similarly, if we have a piece of IR such as
the dataflow node representing the indirection of
&:r2(i.e.,*&:r2) is represented by the same dataflow node as the one representing0:r3because they both represent the same concept: the result of dereferencing&:r2. It just so happens that (in this case) this concept is captured already in the IR and thus there's no need to create a new kind of dataflow node for it.(For more information on this sharing see #11218, #12004, and #14008.)
This PR extends the sharing so that we recognize equivalent nodes across
CopyValueinstructions. So now*&:r4,*r3, and**&:r2all share tuple number in:whereas on
mainthere was a tuple for*&:r4, and another tuple number for*r3and**&:r2.