RFR: 8300256: C2: vectorization is sometimes skipped on loops where it would succeed

Roland Westrelin roland at openjdk.org
Fri Jan 20 15:24:57 UTC 2023


Vectorization for a counted loop cl only proceeds if
cl->range_checks_present() returns true. The result of that method is
computed lazily and its result cached in the CountedLoopNode and never
re-computed. If PhaseIdealLoop::do_range_check() returns 0 then the
result of that computation is overwritten (no range checks
present). PhaseIdealLoop::do_range_check() counts the number of tests
present in the loop body (which is really what range_checks_present()
is about) and decrements that count for every check it eliminates
except if it's not a comparison with a LoadRange (for a reason that I
don't understand). In the case of the test (a pattern from a
ByteBuffer benchmark), not all tests are with a LoadRange. As a
result, PhaseIdealLoop::do_range_check() returns non zero even though
it eliminates all tests. As a result, vectorization is never
attempted.

There doesn't seem to be a value in caching the result of
range_checks_present() in CountedLoopNode. It's not that expensive to
compute, it's only used during loop opts and it's really hard to keep
in sync with whether the loop has still tests: several different
transformations could remove a test. What I propose instead is to keep
roughly the same approach (compute the result lazily and cache it so
it doesn't have to be re-computed) but to store it on the
IdealLoopTree instead (so it's recomputed on every loop opts pass and
there's no risk that it becomes out of sync).

-------------

Commit messages:
 - more
 - maybe more
 - more
 - vectorization not run

Changes: https://git.openjdk.org/jdk/pull/12116/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=12116&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8300256
  Stats: 149 lines in 5 files changed: 81 ins; 41 del; 27 mod
  Patch: https://git.openjdk.org/jdk/pull/12116.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/12116/head:pull/12116

PR: https://git.openjdk.org/jdk/pull/12116


More information about the hotspot-compiler-dev mailing list