In PhaseIdealLoop::split_thru_phi, loop opts.cpp:191 the code snippet
if (x->is_Con()) {
      // Constant's control is always root.
      set_root_as_ctrl(x);
      continue;
    }
sets control of constants to root. This seems suspicious as constants in loop opts should always have their control set to root. However, adding an assert (assert(get_ctrl(x) == C->root(), "constant without root control");) inside the if to test this assumption, immediately triggers with --version. 
This code should be re-examined to ensure this is not just a band-aid solution.
Discussion:
https://github.com/openjdk/jdk/pull/21836#discussion_r1834827466