-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dataflow: Simplify revFlowThrough #18355
Open
smowton
wants to merge
1
commit into
github:main
Choose a base branch
from
smowton:smowton/perf/simplify-rev-flow-through
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains 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
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is disrupting a non-linear join, so it's very likely beneficial to push
flowThroughIntoCall
further into one of the recursive conjuncts in some way - as-is we're likely having some inefficiency with at least one of the two delta+prev combinations. Also, it would be nice to understand a bit deeper which columns are contributing to the blowup in which way.We can safely push the projection
flowThroughIntoCall(_, _, p, ap, innerReturnAp)
intorevFlowParamToReturn
, which may be beneficial, as that's a pure filter on a pre-non-linear-join conjunct, but we cannot push in the other columns as that would amount to a join with the call-graph a bit too soon (revFlowIsReturned
is exactly meant to constrain that part as much as possible).OTOH, it may very well be good to push
flowThroughIntoCall
in its entirety intorevFlowIsReturned
as that already contains the call graph edge. If a project offlowThroughIntoCall
to a pure filter in that case turns out yield a beneficial tuple reduction, then the join ofrevFlowOut
andreturnFlowsThrough
(which occurs in a few places) ought to be revised asflowThroughIntoCall
already contains a projected version ofreturnFlowsThrough
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've tried the two scenarios you're referring to here:
https://github.com/github/codeql/commits/smowton/perf/simplify-rev-flow-through-cand-1 goes for scenario 1, add a filter in
revFlowParamToReturn
. Dead simple; I'll start a DCA shortly.https://github.com/github/codeql/commits/smowton/perf/simplify-rev-flow-through-cand-2 goes for scenario 2, "push
flowThroughIntoCall
in its entirety". However I imagine I've misinterpreted what you want there, since pushing it and adding parameters means we once again have a predicaterevFlowIsReturned
that materialises the product of the threeAp
s, which seems to be the source of the trouble.I'm also not sure what you want re: the join of
revFlowOut
andreturnFlowsThrough
: I replaced_
s on the one invocation ofReturnFlowsThrough
that now coincided with its siblingflowThroughIntoCall
, but found only one other use-site that combinedrevFlowOut
andreturnFlowsThrough
, which seemed difficult to adapt to share anything with the other use-site.I also found that I can no longer reproduce my original performance problem now that during the release we discovered the performance problem introduced by #18235. That suggests that the extra FP flow introduced via vararg array hairpin routes (e.g.
x
->varargs(x, y)
->y
) was crucial in the large blowup I was seeing, and this may not in fact be a relevant problem. I think it still likely is the case thatrevFlowThrough
with its threeAp
arguments is not ideal to materialise, and the materialisations resulting from this PR's simplifications are better in principle, but the specific motivation to chase this down has gone and may not return if this is too much of a pain to get merged.