RFR: 8364766: C2: Improve Value() of DivI and DivL for non-constant inputs [v2]
Tobias Hotz
duke at openjdk.org
Sun Aug 10 12:33:13 UTC 2025
On Sun, 10 Aug 2025 12:26:33 GMT, Tobias Hotz <duke at openjdk.org> wrote:
>> This PR improves the value of interger division nodes.
>> Currently, we only emit a good type if either input is constant. But we can also cover the generic case. It does that by finding the four corners of the division. This is guranteed to find the extrema that we can use for min/max. Some special logic is required for MIN_INT / -1, though, as this is a special case
>> We also need some special logic to handle ranges that cross zero, but in this case, we just need to check for the negative and positive range once.
>> This also cleans up and unifies the code paths for DivINode and DivLNode.
>> I've added some tests to validate the optimization. Without the changes, some of these tests fail.
>
> Tobias Hotz has updated the pull request incrementally with one additional commit since the last revision:
>
> Fixes after review
Thanks for the fast review! The main reason for all the if cases is that min_int / (-1) is undefined behavior in C++, as it overflows. All code has to be careful that this special case can't happen in C++ code, and that's the main motivation behind all the ifs. I've added a comment that describes that.
Otherwise, you would be right: Redudant calculations are no problem, min and max would take care of that.
Regarding testing: I only ran tier1 tests on my machine and GHA
-------------
PR Comment: https://git.openjdk.org/jdk/pull/26143#issuecomment-3172593360
More information about the hotspot-compiler-dev
mailing list