std::vector<CGNodeInfo>
DecisionTreeCompiler::compileSubtrees(CGNodeInfo rootNode,
                                      const CompilerSession &session) {
  std::vector<CGNodeInfo> nodesNextLevel = {rootNode};
  uint8_t remainingLevels = session.Tree.getNumLevels();

  while (remainingLevels > 0) {
    CodeGenerator *codegen = session.selectCodeGenerator(remainingLevels);
    bool isLeafSubtree = (remainingLevels == codegen->getJointSubtreeDepth());

    std::vector<CGNodeInfo> roots = std::move(nodesNextLevel);

    if (isLeafSubtree && codegen->canEmitLeafEvaluation()) {
      compileLeafSubtrees(codegen, std::move(roots), session);
      return {}; // endpoints connected already
    }

    nodesNextLevel = compileNestedSubtrees(codegen, std::move(roots), session);
    remainingLevels -= codegen->getJointSubtreeDepth();
  }

  return nodesNextLevel; // unconnected endpoints
}