On Thu, 13 Feb 2025 16:43:22 GMT, Roland Westrelin <rol...@openjdk.org> wrote:
>> @galderz How sure are that intrinsifying directly is really the right >> approach? >> >> Maybe the approach via `PhaseIdealLoop::conditional_move` where we know the >> branching probability is a better one. Though of course knowing the >> branching probability is no perfect heuristic for how good branch prediction >> is going to be, but it is at least something. >> >> So I'm wondering if there could be a different approach that sees all the >> wins you get here, without any of the regressions? >> >> If we are just interested in better vectorization: the current issue is that >> the auto-vectorizer cannot handle CFG, i.e. we do not yet do if-conversion. >> But if we had if-conversion, then the inlined CFG of min/max would just be >> converted to vector CMove (or vector min/max where available) at that point. >> We can take the branching probabilities into account, just like >> `PhaseIdealLoop::conditional_move` does - if that is necessary. Of course >> if-conversion is far away, and we will encounter a lot of issues with branch >> prediction etc, so I'm scared we might never get there - but I want to try ;) >> >> Do we see any other wins with your patch, that are not due to vectorization, >> but just scalar code? > >> Do we see any other wins with your patch, that are not due to vectorization, >> but just scalar code? > > I think there are some. > > The current transformation from the parsed version of min/max to a > conditional move to a `Max`/`Min` node depends on the conditional move > transformation which has its own set of heuristics and while it happens on > simple test cases, that's not necessarily the case on all code shapes. I > don't think we want to trust it too much. > > With the intrinsic, the type of the min or max can be narrowed down in a way > it can't be whether the code includes control flow or a conditional move. > That in turn, once types have propagated, could cause some constant to appear > and could be a significant win. > > The `Min`/`Max` nodes are floating nodes. They can hoist out of loop and > common reliably in ways that are not guaranteed otherwise. > @rwestrel What do you think about the regressions in the scalar cases of this > patch? Shouldn't int `min`/`max` be affected the same way? I suppose extracting the branch probability from the `MethodData` and attaching it to the `Min`/`Max` nodes is not impossible. I did something like that in the `ScopedValue` PR that you reviewed (and was put on hold). Now, that would be quite a bit of extra complexity for what feels like a corner case. Another possibility would be to implement `CMove` with branches (https://bugs.openjdk.org/browse/JDK-8340206) or to move the implementation of `MinL`/`MovL` in the ad files and experiment with branches there. It seems overall, we likely win more than we loose with this intrinsic, so I would integrate this change as it is and file a bug to keep track of remaining issues. ------------- PR Comment: https://git.openjdk.org/jdk/pull/20098#issuecomment-2659821025