RFR: 8330158: C2: Loop strip mining uses ABS with min int
Dean Long
dlong at openjdk.org
Wed Apr 17 18:55:41 UTC 2024
On Wed, 17 Apr 2024 10:45:04 GMT, Roland Westrelin <roland at openjdk.org> wrote:
> This fixes 3 calls to ABS with a min int argument. I think all of them
> are harmless:
>
> - in `PhaseIdealLoop::exact_limit()`, I removed the call to ABS. The
> check is for a stride of 1 or -1.
>
> - in `OuterStripMinedLoopNode::adjust_strip_mined_loop()`, for the
> computation of `scaled_iters_long`, the stride is passed to `ABS()`
> and then implicitly casted to long. I now cast the stride to long
> before `ABS()`. For a min int stride, `LoopStripMiningIter * stride`
> overflows the int range for all values of `LoopStripMiningIter`
> except 0 or 1. Those values are handled early on in that method. So
> for a min in stride:
> ```
> (jlong)scaled_iters != scaled_iters_long
> ```
> is always true and the method returns early.
>
> - in `OuterStripMinedLoopNode::adjust_strip_mined_loop()`, the
> computation of `short_scaled_iters` also calls `ABS()` with the
> stride as argument. But the result of that computation is only used
> if the test for:
> ```
> (jlong)scaled_iters != scaled_iters_long
> ```
> doesn't cause an early return of the method. I reordered statements
> so the `ABS()` calls happens after that test which will cause an early
> return if the stride is min int.
src/hotspot/share/opto/loopnode.cpp line 2973:
> 2971: return;
> 2972: }
> 2973: int short_scaled_iters = LoopStripMiningIterShortLoop * ABS(stride);
Isn't it true that `stride` can be MIN_INT here, if LoopStripMiningIter == 1?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/18813#discussion_r1569331870
More information about the hotspot-compiler-dev
mailing list