RFR: 8271600: C2: CheckCastPP which should closely follow Allocate is sunk of a loop

Vladimir Ivanov vlivanov at openjdk.java.net
Fri Aug 20 12:22:42 UTC 2021


`PhaseIdealLoop::try_sink_out_of_loop()` tries to move nodes outside a loop. It doesn't work well for cast nodes which accompany `Allocate` nodes:  the cast reifies the effect instance initialization and turns a raw pointer into an oop. Once the cast node doesn't immediately follow the corresponding `Initialize`, it creates a window where the raw pointer is observed. And it can become so wide that the raw pointer crosses a safepoint and has to be recorded in the oop map (that's the case when the reported assertion failure happens). 

Proposed fix is to keep such cast nodes intact. Moreover, I propose to disable the optimization for all flavors of cast nodes. 
Cast nodes usually accompany runtime checks and I don't see much benefit in moving the cast node away while leaving the runtime check inside the loop.  

Testing: hs-tier1 - hs-tier6

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

Commit messages:
 - 8271600: C2: CheckCastPP which should closely follow Allocate is sunk of a loop

Changes: https://git.openjdk.java.net/jdk/pull/5199/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=5199&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8271600
  Stats: 1 line in 1 file changed: 1 ins; 0 del; 0 mod
  Patch: https://git.openjdk.java.net/jdk/pull/5199.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/5199/head:pull/5199

PR: https://git.openjdk.java.net/jdk/pull/5199


More information about the hotspot-compiler-dev mailing list