Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8351833

Unexpected increase in live nodes when splitting Phis through MergeMems in PhiNode::Ideal

XMLWordPrintable

    • b14
    • 25
    • x86_64, aarch64
    • generic

      # Failure analysis

      After the changes for JDK-8333393, we apply a Phi idealization, involving splitting Phis through MergeMems, a lot more frequently. This idealization internally applies further idealizations for new Phi nodes generated during the idealization. In certain cases, these internal idealizations result in a large increase of live nodes within a single iteration of the main IGVN loop in PhaseIterGVN::optimize. In particular, when we are close to the MaxNodeLimit (80 000 by default), it can happen that we go from below MaxNodeLimit - NodeLimitFudgeFactor * 2 (= 76 000 by default) to more than 80 000 nodes in a single iteration. In such cases, the node count bailout at the top of the PhaseIterGVN::optimize loop does not trigger as expected and we instead crash at an assert in node creation as we surpass MaxNodeLimit nodes.

      # Original description

      Since 11th March 2025 we saw a number of the assertions on x86_64 and aarch64, they were triggered by jtreg test javax/xml/crypto/dsig/GenerationTests.java :


      #
      # Internal Error (/priv/jenkins/client-home/workspace/openjdk-jdk-dev-linux_x86_64-dbg/jdk/src/hotspot/share/opto/node.cpp:78), pid=70273, tid=70300
      # assert(C->live_nodes() <= C->max_node_limit()) failed: Live Node limit exceeded limit
      #
       
      V [libjvm.so+0x157d75b] Node::verify_construction()+0x12b (node.cpp:78)
      V [libjvm.so+0x158caa7] Node::clone() const+0x277 (node.cpp:520)
      V [libjvm.so+0x91a191] PhiNode::split_out_instance(TypePtr const*, PhaseIterGVN*) const+0xda1 (cfgnode.cpp:1092)
      V [libjvm.so+0x924e0b] PhiNode::Ideal(PhaseGVN*, bool)+0x279b (cfgnode.cpp:2592)
      V [libjvm.so+0x1682e5d] PhaseIterGVN::transform_old(Node*)+0xbd (phaseX.cpp:668)
      V [libjvm.so+0x926398] PhiNode::Ideal(PhaseGVN*, bool)+0x3d28 (cfgnode.cpp:2579)
      V [libjvm.so+0x1682e5d] PhaseIterGVN::transform_old(Node*)+0xbd (phaseX.cpp:668)
      V [libjvm.so+0x926398] PhiNode::Ideal(PhaseGVN*, bool)+0x3d28 (cfgnode.cpp:2579)
      V [libjvm.so+0x1682e5d] PhaseIterGVN::transform_old(Node*)+0xbd (phaseX.cpp:668)
      V [libjvm.so+0x1678834] PhaseIterGVN::optimize()+0x94 (phaseX.cpp:1046)
      V [libjvm.so+0xa81132] Compile::Optimize()+0xad2 (compile.cpp:2335)
      V [libjvm.so+0xa8430f] Compile::Compile(ciEnv*, ciMethod*, int, Options, DirectiveSet*)+0x1dff (compile.cpp:852)
      V [libjvm.so+0x8c3e40] C2Compiler::compile_method(ciEnv*, ciMethod*, int, bool, DirectiveSet*)+0x430 (c2compiler.cpp:141)
      V [libjvm.so+0xa91e4c] CompileBroker::invoke_compiler_on_method(CompileTask*)+0xbfc (compileBroker.cpp:2331)
      V [libjvm.so+0xa92d88] CompileBroker::compiler_thread_loop()+0x598 (compileBroker.cpp:1975)
      V [libjvm.so+0xf7ecef] JavaThread::thread_main_inner()+0x12f (javaThread.cpp:776)
      V [libjvm.so+0x19473b6] Thread::call_run()+0xb6 (thread.cpp:231)
      V [libjvm.so+0x15f95b8] thread_native_entry(Thread*)+0x128 (os_linux.cpp:877)
       

            dlunden Daniel Lunden
            mbaesken Matthias Baesken
            Votes:
            0 Vote for this issue
            Watchers:
            8 Start watching this issue

              Created:
              Updated: