class_docstr: Matches a call to torch.split if it is in a normalized form. Ensures that all users of
  splits are unique getitems.
class_docstr_tok: ["Matches","a","call","to","torch.split","if","it","is","in","a","normalized","form",".","Ensures","that","all","users","of","splits","are","unique","getitems","."]
code: def _match(self, node: torch.fx.Node, ctx: MatchContext):
      m = super()._match(node, ctx)
      if not m:
          return m
      split_sections = node.args[1]
      if not isinstance(split_sections, (list, tuple)):
          return FailedMatch("split not normalized")
      # check users are all unique getitems
      seen_idxs = set()
      for user in node.users:
          if not CallFunction(operator.getitem, Arg(), Arg()).match(
              user
          ):
              # This should ideally never happen. Split user should always be a getitem
              return FailedMatch(f"user of split not a getitem: {user}")
          if not isinstance(user.args[1], int):
              return FailedMatch("only integer getitems are handled")
          if user.args[1] in seen_idxs:
              return FailedMatch(f"duplicate getitem {user.args[1]}")
          if user.args[-1] < 0:
              # This shouldn't ideally happen as dynamo normalizes indexes to positive
              return FailedMatch("negative index")
          seen_idxs.add(user.args[1])
      return m
  
imports: import itertools
  import logging
  import operator
  from typing import Any, Callable, List, Optional, Sequence, Set, Tuple, Union
  from typing_extensions import TypeAlias
  import torch
  from torch._dynamo.utils import counters
  from ..pattern_matcher import Arg, CallFunction, CallFunctionVarArgs, CallMethodVarArgs, config_flag, FailedMatch, get_arg_value, Ignored, KeywordArg, ListOf, Match, MatchContext, MULTIPLE, PatternExpr, register_graph_pattern, RepeatedExpr
  from .pre_grad import merge_getitem_cat_pass, merge_splits_pass, normalization_pass, split_cat_pass, unbind_stack_pass
label_desc: Use image node_id 2 for calling the TorchSplit obj's underlying member method code with example usage: obj._match(node, ctx) and returns: m, m, FailedMatch, FailedMatch, FailedMatch, FailedMatch, FailedMatch