[jdk16] RFR: 8255763: C2: OSR miscompilation caused by invalid memory instruction placement

Roberto Castañeda Lozano rcastanedalo at openjdk.java.net
Wed Dec 16 09:37:08 UTC 2020


Disable GCM hoisting of memory-writing nodes for irreducible CFGs. This prevents GCM from wrongly "hoisting" stores into descendants of their original loop. Such an "inverted hoisting" can happen due to `CFGLoop::compute_freq()`'s inaccurate estimation of frequencies for irreducible CFGs.

Extend CFG verification code by checking that memory-writing nodes are placed in either their original loop or an ancestor.

Add tests for the reducible and irreducible cases. The former was already handled correctly before the change (the frequency estimation model prevents "inverted hoisting" for reducible CFGs), and is just added for coverage.

This change addresses the specific miscompilation issue in a conservative way, for simplicity and safety. Future work includes investigating if only the illegal blocks can be discarded as candidates for GCM hoisting, and refining frequency estimation for irreducible CFGs.

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

Commit messages:
 - Merge master
 - 8255763: C2: OSR miscompilation caused by invalid memory instruction placement

Changes: https://git.openjdk.java.net/jdk16/pull/22/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk16&pr=22&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8255763
  Stats: 161 lines in 4 files changed: 157 ins; 0 del; 4 mod
  Patch: https://git.openjdk.java.net/jdk16/pull/22.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk16 pull/22/head:pull/22

PR: https://git.openjdk.java.net/jdk16/pull/22


More information about the hotspot-compiler-dev mailing list