C++: Share indirect dataflow nodes across CopyValue instructions
#18955
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.