code: def _get_frontend_submodules(fn_tree: str, gt_fn_tree: str):
      split_index = fn_tree.rfind(".")
      frontend_submods, fn_name = (
          fn_tree[:split_index],
          fn_tree[split_index + 1 :],
      )
  
      # if gt_fn_tree and gt_fn_name are different from our frontend structure
      if gt_fn_tree is not None:
          split_index = gt_fn_tree.rfind(".")
          gt_frontend_submods, gt_fn_name = (
              gt_fn_tree[:split_index],
              gt_fn_tree[split_index + 1 :],
          )
      else:
          gt_frontend_submods, gt_fn_name = (
              fn_tree[25 : fn_tree.rfind(".")],
              fn_name,
          )
      return frontend_submods, fn_name, gt_frontend_submods, gt_fn_name
  
imports: import copy
  import time
  from typing import Union, List, Optional
  import numpy
  import types
  import importlib
  import inspect
  from collections import OrderedDict
  from .globals import mod_backend
  from .pipeline_helper import BackendHandler, BackendHandlerMode, get_frontend_config
  import ivy
  from ivy_tests.test_ivy.helpers.test_parameter_flags import FunctionTestFlags
  import ivy_tests.test_ivy.helpers.test_parameter_flags
  import ivy_tests.test_ivy.helpers.globals
  from ivy.functional.ivy.data_type import _get_function_list, _get_functions_from_string
  from ivy_tests.test_ivy.test_frontends import NativeClass
  from ivy_tests.test_ivy.helpers.structs import FrontendMethodData
  from ivy_tests.test_ivy.helpers.testing_helpers import _create_transpile_report
  from .assertions import value_test, assert_same_type, check_unsupported_dtype
label_desc: Use image node_id 3 for calling a global function with example usage: _get_frontend_submodules(fn_tree, gt_fn_tree) and returns: frontend_submods,  fn_name,  gt_frontend_submods,  gt_fn_name