RFR: 8261235: C1 compilation fails with assert(res->vreg_number() == index) failed: conversion check

Christian Hagedorn chagedorn at openjdk.java.net
Fri Feb 12 10:08:56 UTC 2021


The assertion is hit because we run out of virtual registers in the linear scan in C1 and do not handle it. I fixed it by applying the same bailout as in `LIRGenerator::new_register()`. 

There is also a second issue that `LIR_OprDesc::vreg_max` is too big. It is only used in this bailout code. `OprBits::vreg_max` is defined over `OprBits::data_bits` which uses `OprBits::non_data_bits`. But `OprBits::non_data_bits` does not consider `OprBits::pointer_bits` which results in a too large value for `LIR_OprDesc::vreg_max` and the assertion is hit because we don't bail out, yet. This needs to be fixed as well.

Thanks,
Christian

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

Commit messages:
 - 8261235: C1 compilation fails with assert(res->vreg_number() == index) failed: conversion check

Changes: https://git.openjdk.java.net/jdk/pull/2543/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2543&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8261235
  Stats: 4151 lines in 6 files changed: 4137 ins; 2 del; 12 mod
  Patch: https://git.openjdk.java.net/jdk/pull/2543.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/2543/head:pull/2543

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


More information about the hotspot-compiler-dev mailing list