parameters: (self, ir, calltypes)
return_statement: return (kernel_copy, copy_calltypes)
docstring: Create a copy of a given IR along with its calltype information.
          We need a copy of the calltypes because copy propagation applied
          to the copied IR will change the calltypes and make subsequent
          uses of the original IR invalid.
docstring_summary: Create a copy of a given IR along with its calltype information.
          We need a copy of the calltypes because copy propagation applied
          to the copied IR will change the calltypes and make subsequent
          uses of the original IR invalid.
docstring_tokens: Create a copy of a given IR along with its calltype information . We need a copy of the calltypes because copy propagation applied to the copied IR will change the calltypes and make subsequent uses of the original IR invalid .
function: def copy_ir_with_calltypes(self, ir, calltypes):
          """
          Create a copy of a given IR along with its calltype information.
          We need a copy of the calltypes because copy propagation applied
          to the copied IR will change the calltypes and make subsequent
          uses of the original IR invalid.
          """
          copy_calltypes = {}
          kernel_copy = ir.copy()
          kernel_copy.blocks = {}
          # For each block...
          for (block_label, block) in ir.blocks.items():
              new_block = copy.deepcopy(ir.blocks[block_label])
              new_block.body = []
              # For each statement in each block...
              for stmt in ir.blocks[block_label].body:
                  # Copy the statement to the new copy of the kernel
                  # and if the original statement is in the original
                  # calltypes then add the type associated with this
                  # statement to the calltypes copy.
                  scopy = copy.deepcopy(stmt)
                  new_block.body.append(scopy)
                  if stmt in calltypes:
                      copy_calltypes[scopy] = calltypes[stmt]
              kernel_copy.blocks[block_label] = new_block
          return (kernel_copy, copy_calltypes)
function_tokens: def copy_ir_with_calltypes ( self , ir , calltypes ) : copy_calltypes = { } kernel_copy = ir . copy ( ) kernel_copy . blocks = { } # For each block... for ( block_label , block ) in ir . blocks . items ( ) : new_block = copy . deepcopy ( ir . blocks [ block_label ] ) new_block . body = [ ] # For each statement in each block... for stmt in ir . blocks [ block_label ] . body : # Copy the statement to the new copy of the kernel # and if the original statement is in the original # calltypes then add the type associated with this # statement to the calltypes copy. scopy = copy . deepcopy ( stmt ) new_block . body . append ( scopy ) if stmt in calltypes : copy_calltypes [ scopy ] = calltypes [ stmt ] kernel_copy . blocks [ block_label ] = new_block return ( kernel_copy , copy_calltypes )