Skip to content

Use indirect call effects in LinearExecutionWalker#8738

Merged
stevenfontanella merged 4 commits into
mainfrom
linear-execution-walker-indirect-call
May 23, 2026
Merged

Use indirect call effects in LinearExecutionWalker#8738
stevenfontanella merged 4 commits into
mainfrom
linear-execution-walker-indirect-call

Conversation

@stevenfontanella
Copy link
Copy Markdown
Member

@stevenfontanella stevenfontanella commented May 20, 2026

Part of #8615. Follows up from #8637 now that global effects for indirect calls has been added.

Allows LinearExecutionWalker to not halt and continue scanning when an indirect call is encountered in the case the global effects have been computed under --closed-world and we determined that the indirect call can't have any throw effects. LinearExecutionWalker is used in the following passes:

  • LocalGraph
  • LocalCSE
  • OptimizeCasts
  • SimplifyGlobals
  • SimplifyLocals
  • GUFA
  • TypeRefining

@stevenfontanella stevenfontanella force-pushed the linear-execution-walker-indirect-call branch 2 times, most recently from 1bb3583 to b8567b2 Compare May 20, 2026 22:20
@stevenfontanella stevenfontanella changed the title LinearExecutionWalker indirect call effects Use indirect call effects in LinearExecutionWalker May 21, 2026
@stevenfontanella stevenfontanella marked this pull request as ready for review May 21, 2026 01:20
@stevenfontanella stevenfontanella requested a review from a team as a code owner May 21, 2026 01:20
@stevenfontanella stevenfontanella requested review from tlively and removed request for a team May 21, 2026 01:20
Copy link
Copy Markdown
Member

@tlively tlively left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice!

Comment thread src/ir/linear-execution.h Outdated
Comment thread src/support/utilities.h
Comment thread src/ir/linear-execution.h
Comment thread src/ir/linear-execution.h Outdated
;; that the only possible target for this ref is $const in a closed world,
;; which wouldn't block our optimizations.
;; TODO: Add effects analysis for indirect calls.
;; With --closed-world enabled, we can tell that this can only possibly call
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think --closed-world isn't even necessary for this, since this module has no imports or exports. There's no way for an outside function reference to sneak in.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, is it worth doing any indirect call analysis in the open world case? We could aggregate type effects unconditionally, and if we see a function ref that's imported or exported then invalidate the effects for that type and all subtypes. But any exported table of funcref would be enough to stop all analysis, and I know that many users use --closed-world anyway?

In practice, we only do indirect call analysis if --closed-world is enabled, so I think the comment is appropriate. It's still true that --closed-world is enough to determine that $const is the only possible callee here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should do indirect call analysis in open world, too. It just needs to respect the public/private type classification it gets from module-utils.h. (In the long run we want everything to run in both open-world and closed-world and fully encapsulate the difference in the type visibility classfication.)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll leave this alone since I think the comment is still accurate for now based on #8754. In the future we can change GlobalEffects to look at public/private for types instead of --closed-world at which point we can change this.

@tlively
Copy link
Copy Markdown
Member

tlively commented May 21, 2026

I would also fuzz this heavily, just in case.

@stevenfontanella
Copy link
Copy Markdown
Member Author

I would also fuzz this heavily, just in case.

Ran overnight for 16k iterations with no issues.

@stevenfontanella stevenfontanella force-pushed the linear-execution-walker-indirect-call branch from b8567b2 to 3cda588 Compare May 22, 2026 18:45
(drop (call_indirect (type $const-type) (i32.const 0)))
;; Similar to above, except here we can tell that the indirect call may
;; throw so optimization is halted.
(drop (call_indirect (type $throw-type) (i32.const 0)))
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess SimplifyLocals could be improved to optimize here despite the throws effect, but that's unrelated to this PR.

@stevenfontanella stevenfontanella enabled auto-merge (squash) May 22, 2026 23:45
@stevenfontanella stevenfontanella merged commit abfdaee into main May 23, 2026
16 checks passed
@stevenfontanella stevenfontanella deleted the linear-execution-walker-indirect-call branch May 23, 2026 00:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants