class_docstr: Performs Value Range Analysis on LoopBody's fx graph by calling BoundVars.run()
  It exposes the ranges of the nodes in the `bounds` variable
  
  Note. A current limitation of this analysis is that it just works on a per-loop basis.
  We should be able to propagate the bounds between across the whole graph. This may benefit
  the case a bounded variable is returned by a kernel and fed into another.
code: def get_index(self, name: Expr) -> ValueRanges:
      expr = self.loop_body.indexing_exprs[name]
      bound = self.replacement_vals.get(expr)
      if bound is None:
          bound = bound_sympy(expr, self.replacement_vals)
      # The following assertion is true at the time of this writing
      # We don't assert is as to not execute bound_sympy when bound is not None
      # assert bound is None or bound == bound_sympy(expr, self.replacement_vals)
      self.replacement_vals[name] = bound
      return bound
  
file_path: pytorch/torch/_inductor/bounds.py
imports: import operator
  from functools import partial
  from typing import Any, Callable, Dict
  from sympy import Expr
  import torch
  from torch.utils._sympy.value_ranges import bound_sympy, ValueRangeAnalysis, ValueRanges
  from .ir import InterpreterShim, LoopBody, LoopBodyBlock
  from .utils import cache_on_self, dominated_nodes
  from .virtualized import V
label_desc: Use image node_id 6 for calling the BoundVars obj's underlying member method code with example usage: obj.get_index(name) and returns: bound