RFR: 8347901: C2 should remove unused leaf / pure runtime calls
Marc Chevalier
mchevalier at openjdk.org
Tue May 6 07:46:14 UTC 2025
On Wed, 30 Apr 2025 13:18:33 GMT, Marc Chevalier <mchevalier at openjdk.org> wrote:
> A first part toward a better support of pure functions.
>
> ## Pure Functions
>
> Pure functions (considered here) are functions that have no side effects, no effect on the control flow (no exception or such), cannot deopt etc.. It's really a function that you can execute anywhere, with whichever arguments without effect other than wasting time. Integer division is not pure as dividing by zero is throwing. But many floating point functions will just return `NaN` or `+/-infinity` in problematic cases.
>
> ## Scope
>
> We are not going all powerful for now! It's mostly about identifying some pure functions and being able to remove them if the result is unused. Some other things are not part of this PR, on purpose. Especially, this PR doesn't propose a way to move pure calls around. The reason is that pure calls are macro nodes later expanded into other, regular calls, which require a control input. To be able to do the expansion, we just keep the control in the pure call as well.
>
> ## Implementation Overview
>
> We created here some new node kind for pure calls that are expanded into regular calls during macro expansion. This also allows the removal of `ModD` and `ModF` nodes that have their pure equivalent now. They are surprisingly hard to unify with other floating point functions from an implementation point of view!
>
> IR framework and IGV needed a little bit of fixing.
>
> Thanks,
> Marc
Thanks for the comment. I'll think deeper about it.
I've started by trying to make PureCall a subclass of Call (or a property of LeafCall) but that broke a lot of things that were using some invariants on CallNode that weren't holding anymore. After a some time tracking bugs and trying to fix, I thought it would be simpler to have a new kind of node, and it would have less impact on existing code. Another reason I've changed it to a direct sub-class of Node is that I felt it made little sense to be a Call (or sub-class of) since Calls are Safepoint, but pure calls don't need to be (and similar "conceptual" problems). It seemed like a hack to me.
About
> support arbitrary nodes to be lowered into leaf runtime calls.
I don't think I understand what you mean. Overall, I see the weaknesses of my design, but I'm not sure which direction to take instead.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/24966#issuecomment-2853576338
More information about the graal-dev
mailing list