class_docstr: Remove ops that have no effect.
  
  .. code-block::
  
      Given:
          %1 (1, 96, 128, 64, fp32) = ...
          %2 (1, 96, 128, 64, fp32) = reshape(%1)
          ...
          %3 (1, 96, 128, 64, fp32) = add(%2, constant)
          ...
  
      Result:
          %1 (1, 96, 128, 64, fp32) = ...
          %3 (1, 96, 128, 64, fp32) = add(%1, constant)
      ...
code: def _noop_elimination_block_wrapper(self, block):
      def _noop_elimination_block(block):
          for op in list(block.operations):
              for b in op.blocks:
                  block_changed = True
                  while block_changed:
                      block_changed = _noop_elimination_block(b)
              if len(op.blocks) > 0:
                  continue
  
              remove_fn = noop_elimination._match_pattern(op)
              if remove_fn is not None:
                  status = remove_fn(op)
                  # has to break as the downstream iterator is affected.
                  if status:
                      return status
          return False
  
      block_changed = True
      while block_changed:
          block_changed = _noop_elimination_block(block)
  
file_path: coremltools/coremltools/converters/mil/mil/passes/defs/cleanup/noop_elimination.py
imports: import numpy
  from coremltools.converters.mil.mil.passes.graph_pass import AbstractGraphPass
  from coremltools.converters.mil.mil.passes.helper import block_context_manager
  from coremltools.converters.mil.mil.passes.pass_registry import register_pass
label_desc: Use image node_id 3 for calling the noop_elimination obj's underlying member method code with example usage: obj._noop_elimination_block_wrapper(block) and returns: False, status