numba-cuda 0.21.1__cp313-cp313-win_amd64.whl → 0.23.0__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. numba_cuda/VERSION +1 -1
  2. numba_cuda/numba/cuda/api.py +4 -1
  3. numba_cuda/numba/cuda/cext/_dispatcher.cp313-win_amd64.pyd +0 -0
  4. numba_cuda/numba/cuda/cext/_dispatcher.cpp +0 -38
  5. numba_cuda/numba/cuda/cext/_helperlib.cp313-win_amd64.pyd +0 -0
  6. numba_cuda/numba/cuda/cext/_typeconv.cp313-win_amd64.pyd +0 -0
  7. numba_cuda/numba/cuda/cext/_typeof.cpp +0 -111
  8. numba_cuda/numba/cuda/cext/mviewbuf.cp313-win_amd64.pyd +0 -0
  9. numba_cuda/numba/cuda/codegen.py +42 -10
  10. numba_cuda/numba/cuda/compiler.py +10 -4
  11. numba_cuda/numba/cuda/core/analysis.py +29 -21
  12. numba_cuda/numba/cuda/core/annotations/type_annotations.py +4 -4
  13. numba_cuda/numba/cuda/core/base.py +6 -1
  14. numba_cuda/numba/cuda/core/consts.py +1 -1
  15. numba_cuda/numba/cuda/core/cuda_errors.py +917 -0
  16. numba_cuda/numba/cuda/core/errors.py +4 -912
  17. numba_cuda/numba/cuda/core/inline_closurecall.py +71 -57
  18. numba_cuda/numba/cuda/core/interpreter.py +79 -64
  19. numba_cuda/numba/cuda/core/ir.py +191 -119
  20. numba_cuda/numba/cuda/core/ir_utils.py +142 -112
  21. numba_cuda/numba/cuda/core/postproc.py +8 -8
  22. numba_cuda/numba/cuda/core/rewrites/ir_print.py +6 -3
  23. numba_cuda/numba/cuda/core/rewrites/static_getitem.py +5 -5
  24. numba_cuda/numba/cuda/core/rewrites/static_raise.py +3 -3
  25. numba_cuda/numba/cuda/core/ssa.py +3 -3
  26. numba_cuda/numba/cuda/core/transforms.py +25 -10
  27. numba_cuda/numba/cuda/core/typed_passes.py +9 -9
  28. numba_cuda/numba/cuda/core/typeinfer.py +39 -24
  29. numba_cuda/numba/cuda/core/untyped_passes.py +71 -55
  30. numba_cuda/numba/cuda/cudadecl.py +0 -13
  31. numba_cuda/numba/cuda/cudadrv/devicearray.py +6 -5
  32. numba_cuda/numba/cuda/cudadrv/driver.py +132 -511
  33. numba_cuda/numba/cuda/cudadrv/dummyarray.py +4 -0
  34. numba_cuda/numba/cuda/cudadrv/nvrtc.py +16 -0
  35. numba_cuda/numba/cuda/cudaimpl.py +0 -12
  36. numba_cuda/numba/cuda/debuginfo.py +104 -10
  37. numba_cuda/numba/cuda/descriptor.py +1 -1
  38. numba_cuda/numba/cuda/device_init.py +4 -7
  39. numba_cuda/numba/cuda/dispatcher.py +36 -32
  40. numba_cuda/numba/cuda/intrinsics.py +150 -1
  41. numba_cuda/numba/cuda/lowering.py +64 -29
  42. numba_cuda/numba/cuda/memory_management/nrt.py +10 -14
  43. numba_cuda/numba/cuda/np/arrayobj.py +54 -0
  44. numba_cuda/numba/cuda/np/numpy_support.py +26 -0
  45. numba_cuda/numba/cuda/printimpl.py +20 -0
  46. numba_cuda/numba/cuda/serialize.py +10 -0
  47. numba_cuda/numba/cuda/stubs.py +0 -11
  48. numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +21 -4
  49. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +1 -2
  50. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +130 -48
  51. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +6 -2
  52. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +3 -1
  53. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +5 -6
  54. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +11 -12
  55. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +27 -19
  56. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +47 -0
  57. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +10 -0
  58. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +89 -0
  59. numba_cuda/numba/cuda/tests/cudapy/test_device_array_capture.py +243 -0
  60. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +3 -3
  61. numba_cuda/numba/cuda/tests/cudapy/test_numba_interop.py +35 -0
  62. numba_cuda/numba/cuda/tests/cudapy/test_print.py +51 -0
  63. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +116 -1
  64. numba_cuda/numba/cuda/tests/doc_examples/test_globals.py +111 -0
  65. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +61 -0
  66. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +31 -0
  67. numba_cuda/numba/cuda/typing/context.py +3 -1
  68. numba_cuda/numba/cuda/typing/typeof.py +56 -0
  69. {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/METADATA +1 -1
  70. {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/RECORD +74 -74
  71. numba_cuda/numba/cuda/cext/_devicearray.cp313-win_amd64.pyd +0 -0
  72. numba_cuda/numba/cuda/cext/_devicearray.cpp +0 -159
  73. numba_cuda/numba/cuda/cext/_devicearray.h +0 -29
  74. numba_cuda/numba/cuda/intrinsic_wrapper.py +0 -41
  75. {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/WHEEL +0 -0
  76. {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/licenses/LICENSE +0 -0
  77. {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/licenses/LICENSE.numba +0 -0
  78. {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/top_level.txt +0 -0
@@ -215,7 +215,7 @@ def convert_size_to_var(size_var, typemap, scope, loc, nodes):
215
215
  size_assign = ir.Assign(ir.Const(size_var, loc), new_size, loc)
216
216
  nodes.append(size_assign)
217
217
  return new_size
218
- assert isinstance(size_var, ir.Var)
218
+ assert isinstance(size_var, ir.var_types)
219
219
  return size_var
220
220
 
221
221
 
@@ -275,7 +275,7 @@ def mk_range_block(typemap, start, stop, step, calltypes, scope, loc):
275
275
 
276
276
  def _mk_range_args(typemap, start, stop, step, scope, loc):
277
277
  nodes = []
278
- if isinstance(stop, ir.Var):
278
+ if isinstance(stop, ir.var_types):
279
279
  g_stop_var = stop
280
280
  else:
281
281
  assert isinstance(stop, int)
@@ -287,7 +287,7 @@ def _mk_range_args(typemap, start, stop, step, scope, loc):
287
287
  if start == 0 and step == 1:
288
288
  return nodes, [g_stop_var]
289
289
 
290
- if isinstance(start, ir.Var):
290
+ if isinstance(start, ir.var_types):
291
291
  g_start_var = start
292
292
  else:
293
293
  assert isinstance(start, int)
@@ -299,7 +299,7 @@ def _mk_range_args(typemap, start, stop, step, scope, loc):
299
299
  if step == 1:
300
300
  return nodes, [g_start_var, g_stop_var]
301
301
 
302
- if isinstance(step, ir.Var):
302
+ if isinstance(step, ir.var_types):
303
303
  g_step_var = step
304
304
  else:
305
305
  assert isinstance(step, int)
@@ -395,7 +395,7 @@ def replace_var_names(blocks, namedict):
395
395
  new_namedict[l] = r
396
396
 
397
397
  def replace_name(var, namedict):
398
- assert isinstance(var, ir.Var)
398
+ assert isinstance(var, ir.var_types)
399
399
  while var.name in namedict:
400
400
  var = ir.Var(var.scope, namedict[var.name], var.loc)
401
401
  return var
@@ -404,7 +404,7 @@ def replace_var_names(blocks, namedict):
404
404
 
405
405
 
406
406
  def replace_var_callback(var, vardict):
407
- assert isinstance(var, ir.Var)
407
+ assert isinstance(var, ir.var_types)
408
408
  while var.name in vardict.keys():
409
409
  assert vardict[var.name].name != var.name
410
410
  new_var = vardict[var.name]
@@ -451,44 +451,44 @@ def visit_vars_stmt(stmt, callback, cbdata):
451
451
  if isinstance(stmt, t):
452
452
  f(stmt, callback, cbdata)
453
453
  return
454
- if isinstance(stmt, ir.Assign):
454
+ if isinstance(stmt, ir.assign_types):
455
455
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
456
456
  stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
457
- elif isinstance(stmt, ir.Arg):
457
+ elif isinstance(stmt, ir.arg_types):
458
458
  stmt.name = visit_vars_inner(stmt.name, callback, cbdata)
459
- elif isinstance(stmt, ir.Return):
459
+ elif isinstance(stmt, ir.return_types):
460
460
  stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
461
- elif isinstance(stmt, ir.Raise):
461
+ elif isinstance(stmt, ir.raise_types):
462
462
  stmt.exception = visit_vars_inner(stmt.exception, callback, cbdata)
463
- elif isinstance(stmt, ir.Branch):
463
+ elif isinstance(stmt, ir.branch_types):
464
464
  stmt.cond = visit_vars_inner(stmt.cond, callback, cbdata)
465
- elif isinstance(stmt, ir.Jump):
465
+ elif isinstance(stmt, ir.jump_types):
466
466
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
467
- elif isinstance(stmt, ir.Del):
467
+ elif isinstance(stmt, ir.del_types):
468
468
  # Because Del takes only a var name, we make up by
469
469
  # constructing a temporary variable.
470
470
  var = ir.Var(None, stmt.value, stmt.loc)
471
471
  var = visit_vars_inner(var, callback, cbdata)
472
472
  stmt.value = var.name
473
- elif isinstance(stmt, ir.DelAttr):
473
+ elif isinstance(stmt, ir.delattr_types):
474
474
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
475
475
  stmt.attr = visit_vars_inner(stmt.attr, callback, cbdata)
476
- elif isinstance(stmt, ir.SetAttr):
476
+ elif isinstance(stmt, ir.setattr_types):
477
477
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
478
478
  stmt.attr = visit_vars_inner(stmt.attr, callback, cbdata)
479
479
  stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
480
- elif isinstance(stmt, ir.DelItem):
480
+ elif isinstance(stmt, ir.delitem_types):
481
481
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
482
482
  stmt.index = visit_vars_inner(stmt.index, callback, cbdata)
483
- elif isinstance(stmt, ir.StaticSetItem):
483
+ elif isinstance(stmt, ir.staticsetitem_types):
484
484
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
485
485
  stmt.index_var = visit_vars_inner(stmt.index_var, callback, cbdata)
486
486
  stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
487
- elif isinstance(stmt, ir.SetItem):
487
+ elif isinstance(stmt, ir.setitem_types):
488
488
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
489
489
  stmt.index = visit_vars_inner(stmt.index, callback, cbdata)
490
490
  stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
491
- elif isinstance(stmt, ir.Print):
491
+ elif isinstance(stmt, ir.print_types):
492
492
  stmt.args = [visit_vars_inner(x, callback, cbdata) for x in stmt.args]
493
493
  else:
494
494
  # TODO: raise NotImplementedError("no replacement for IR node: ", stmt)
@@ -497,13 +497,13 @@ def visit_vars_stmt(stmt, callback, cbdata):
497
497
 
498
498
 
499
499
  def visit_vars_inner(node, callback, cbdata):
500
- if isinstance(node, ir.Var):
500
+ if isinstance(node, ir.var_types):
501
501
  return callback(node, cbdata)
502
502
  elif isinstance(node, list):
503
503
  return [visit_vars_inner(n, callback, cbdata) for n in node]
504
504
  elif isinstance(node, tuple):
505
505
  return tuple([visit_vars_inner(n, callback, cbdata) for n in node])
506
- elif isinstance(node, ir.Expr):
506
+ elif isinstance(node, ir.expr_types):
507
507
  # if node.op in ['binop', 'inplace_binop']:
508
508
  # lhs = node.lhs.name
509
509
  # rhs = node.rhs.name
@@ -511,7 +511,7 @@ def visit_vars_inner(node, callback, cbdata):
511
511
  # node.rhs.name = callback, cbdata.get(rhs, rhs)
512
512
  for arg in node._kws.keys():
513
513
  node._kws[arg] = visit_vars_inner(node._kws[arg], callback, cbdata)
514
- elif isinstance(node, ir.Yield):
514
+ elif isinstance(node, ir.yield_types):
515
515
  node.value = visit_vars_inner(node.value, callback, cbdata)
516
516
  return node
517
517
 
@@ -531,9 +531,9 @@ def add_offset_to_labels(blocks, offset):
531
531
  for T, f in add_offset_to_labels_extensions.items():
532
532
  if isinstance(inst, T):
533
533
  f(inst, offset)
534
- if isinstance(term, ir.Jump):
534
+ if isinstance(term, ir.jump_types):
535
535
  b.body[-1] = ir.Jump(term.target + offset, term.loc)
536
- if isinstance(term, ir.Branch):
536
+ if isinstance(term, ir.branch_types):
537
537
  b.body[-1] = ir.Branch(
538
538
  term.cond, term.truebr + offset, term.falsebr + offset, term.loc
539
539
  )
@@ -578,9 +578,9 @@ def flatten_labels(blocks):
578
578
  term = None
579
579
  if b.body:
580
580
  term = b.body[-1]
581
- if isinstance(term, ir.Jump):
581
+ if isinstance(term, ir.jump_types):
582
582
  b.body[-1] = ir.Jump(l_map[term.target], term.loc)
583
- if isinstance(term, ir.Branch):
583
+ if isinstance(term, ir.branch_types):
584
584
  b.body[-1] = ir.Branch(
585
585
  term.cond, l_map[term.truebr], l_map[term.falsebr], term.loc
586
586
  )
@@ -593,7 +593,7 @@ def remove_dels(blocks):
593
593
  for block in blocks.values():
594
594
  new_body = []
595
595
  for stmt in block.body:
596
- if not isinstance(stmt, ir.Del):
596
+ if not isinstance(stmt, ir.del_types):
597
597
  new_body.append(stmt)
598
598
  block.body = new_body
599
599
  return
@@ -604,7 +604,9 @@ def remove_args(blocks):
604
604
  for block in blocks.values():
605
605
  new_body = []
606
606
  for stmt in block.body:
607
- if isinstance(stmt, ir.Assign) and isinstance(stmt.value, ir.Arg):
607
+ if isinstance(stmt, ir.assign_types) and isinstance(
608
+ stmt.value, ir.arg_types
609
+ ):
608
610
  continue
609
611
  new_body.append(stmt)
610
612
  block.body = new_body
@@ -737,7 +739,7 @@ def remove_dead_block(
737
739
  continue
738
740
 
739
741
  # ignore assignments that their lhs is not live or lhs==rhs
740
- if isinstance(stmt, ir.Assign):
742
+ if isinstance(stmt, ir.assign_types):
741
743
  lhs = stmt.target
742
744
  rhs = stmt.value
743
745
  if lhs.name not in lives and has_no_side_effect(
@@ -747,21 +749,21 @@ def remove_dead_block(
747
749
  print("Statement was removed.")
748
750
  removed = True
749
751
  continue
750
- if isinstance(rhs, ir.Var) and lhs.name == rhs.name:
752
+ if isinstance(rhs, ir.var_types) and lhs.name == rhs.name:
751
753
  if config.DEBUG_ARRAY_OPT >= 2:
752
754
  print("Statement was removed.")
753
755
  removed = True
754
756
  continue
755
757
  # TODO: remove other nodes like SetItem etc.
756
758
 
757
- if isinstance(stmt, ir.Del):
759
+ if isinstance(stmt, ir.del_types):
758
760
  if stmt.value not in lives:
759
761
  if config.DEBUG_ARRAY_OPT >= 2:
760
762
  print("Statement was removed.")
761
763
  removed = True
762
764
  continue
763
765
 
764
- if isinstance(stmt, ir.SetItem):
766
+ if isinstance(stmt, ir.setitem_types):
765
767
  name = stmt.target.name
766
768
  if name not in lives_n_aliases:
767
769
  if config.DEBUG_ARRAY_OPT >= 2:
@@ -775,9 +777,9 @@ def remove_dead_block(
775
777
  lives |= uses
776
778
  else:
777
779
  lives |= {v.name for v in stmt.list_vars()}
778
- if isinstance(stmt, ir.Assign):
780
+ if isinstance(stmt, ir.assign_types):
779
781
  # make sure lhs is not used in rhs, e.g. a = g(a)
780
- if isinstance(stmt.value, ir.Expr):
782
+ if isinstance(stmt.value, ir.expr_types):
781
783
  rhs_vars = {v.name for v in stmt.value.list_vars()}
782
784
  if lhs.name not in rhs_vars:
783
785
  lives.remove(lhs.name)
@@ -809,7 +811,7 @@ def has_no_side_effect(rhs, lives, call_table):
809
811
  """
810
812
  from numba.cuda.extending import _Intrinsic
811
813
 
812
- if isinstance(rhs, ir.Expr) and rhs.op == "call":
814
+ if isinstance(rhs, ir.expr_types) and rhs.op == "call":
813
815
  func_name = rhs.func.name
814
816
  if func_name not in call_table or call_table[func_name] == []:
815
817
  return False
@@ -843,11 +845,11 @@ def has_no_side_effect(rhs, lives, call_table):
843
845
  if f(rhs, lives, call_list):
844
846
  return True
845
847
  return False
846
- if isinstance(rhs, ir.Expr) and rhs.op == "inplace_binop":
848
+ if isinstance(rhs, ir.expr_types) and rhs.op == "inplace_binop":
847
849
  return rhs.lhs.name not in lives
848
- if isinstance(rhs, ir.Yield):
850
+ if isinstance(rhs, ir.yield_types):
849
851
  return False
850
- if isinstance(rhs, ir.Expr) and rhs.op == "pair_first":
852
+ if isinstance(rhs, ir.expr_types) and rhs.op == "pair_first":
851
853
  # don't remove pair_first since prange looks for it
852
854
  return False
853
855
  return True
@@ -861,7 +863,7 @@ def is_pure(rhs, lives, call_table):
861
863
  returns the same result. This is not the case for things
862
864
  like calls to numpy.random.
863
865
  """
864
- if isinstance(rhs, ir.Expr):
866
+ if isinstance(rhs, ir.expr_types):
865
867
  if rhs.op == "call":
866
868
  func_name = rhs.func.name
867
869
  if func_name not in call_table or call_table[func_name] == []:
@@ -882,7 +884,7 @@ def is_pure(rhs, lives, call_table):
882
884
  return False
883
885
  elif rhs.op == "getiter" or rhs.op == "iternext":
884
886
  return False
885
- if isinstance(rhs, ir.Yield):
887
+ if isinstance(rhs, ir.yield_types):
886
888
  return False
887
889
  return True
888
890
 
@@ -926,39 +928,42 @@ def find_potential_aliases(
926
928
  if type(instr) in alias_analysis_extensions:
927
929
  f = alias_analysis_extensions[type(instr)]
928
930
  f(instr, args, typemap, func_ir, alias_map, arg_aliases)
929
- if isinstance(instr, ir.Assign):
931
+ if isinstance(instr, ir.assign_types):
930
932
  expr = instr.value
931
933
  lhs = instr.target.name
932
934
  # only mutable types can alias
933
935
  if is_immutable_type(lhs, typemap):
934
936
  continue
935
- if isinstance(expr, ir.Var) and lhs != expr.name:
937
+ if isinstance(expr, ir.var_types) and lhs != expr.name:
936
938
  _add_alias(lhs, expr.name, alias_map, arg_aliases)
937
939
  # subarrays like A = B[0] for 2D B
938
- if isinstance(expr, ir.Expr) and (
940
+ if isinstance(expr, ir.expr_types) and (
939
941
  expr.op == "cast"
940
942
  or expr.op in ["getitem", "static_getitem"]
941
943
  ):
942
944
  _add_alias(lhs, expr.value.name, alias_map, arg_aliases)
943
- if isinstance(expr, ir.Expr) and expr.op == "inplace_binop":
945
+ if (
946
+ isinstance(expr, ir.expr_types)
947
+ and expr.op == "inplace_binop"
948
+ ):
944
949
  _add_alias(lhs, expr.lhs.name, alias_map, arg_aliases)
945
950
  # array attributes like A.T
946
951
  if (
947
- isinstance(expr, ir.Expr)
952
+ isinstance(expr, ir.expr_types)
948
953
  and expr.op == "getattr"
949
954
  and expr.attr in ["T", "ctypes", "flat"]
950
955
  ):
951
956
  _add_alias(lhs, expr.value.name, alias_map, arg_aliases)
952
957
  # a = b.c. a should alias b
953
958
  if (
954
- isinstance(expr, ir.Expr)
959
+ isinstance(expr, ir.expr_types)
955
960
  and expr.op == "getattr"
956
961
  and expr.attr not in ["shape"]
957
962
  and expr.value.name in arg_aliases
958
963
  ):
959
964
  _add_alias(lhs, expr.value.name, alias_map, arg_aliases)
960
965
  # calls that can create aliases such as B = A.ravel()
961
- if isinstance(expr, ir.Expr) and expr.op == "call":
966
+ if isinstance(expr, ir.expr_types) and expr.op == "call":
962
967
  fdef = guard(find_callname, func_ir, expr, typemap)
963
968
  # TODO: sometimes gufunc backend creates duplicate code
964
969
  # causing find_callname to fail. Example: test_argmax
@@ -974,7 +979,10 @@ def find_potential_aliases(
974
979
  _add_alias(
975
980
  lhs, expr.args[0].name, alias_map, arg_aliases
976
981
  )
977
- if isinstance(fmod, ir.Var) and fname in np_alias_funcs:
982
+ if (
983
+ isinstance(fmod, ir.var_types)
984
+ and fname in np_alias_funcs
985
+ ):
978
986
  _add_alias(lhs, fmod.name, alias_map, arg_aliases)
979
987
 
980
988
  # copy to avoid changing size during iteration
@@ -1125,9 +1133,9 @@ def get_block_copies(blocks, typemap):
1125
1133
  extra_kill[label].add(l)
1126
1134
  assign_dict = new_assign_dict
1127
1135
  extra_kill[label] |= kill_set
1128
- if isinstance(stmt, ir.Assign):
1136
+ if isinstance(stmt, ir.assign_types):
1129
1137
  lhs = stmt.target.name
1130
- if isinstance(stmt.value, ir.Var):
1138
+ if isinstance(stmt.value, ir.var_types):
1131
1139
  rhs = stmt.value.name
1132
1140
  # copy is valid only if same type (see
1133
1141
  # TestCFunc.test_locals)
@@ -1139,7 +1147,7 @@ def get_block_copies(blocks, typemap):
1139
1147
  assign_dict[lhs] = rhs
1140
1148
  continue
1141
1149
  if (
1142
- isinstance(stmt.value, ir.Expr)
1150
+ isinstance(stmt.value, ir.expr_types)
1143
1151
  and stmt.value.op == "inplace_binop"
1144
1152
  ):
1145
1153
  in1_var = stmt.value.lhs.name
@@ -1195,7 +1203,7 @@ def apply_copy_propagate(
1195
1203
  )
1196
1204
  # only rhs of assignments should be replaced
1197
1205
  # e.g. if x=y is available, x in x=z shouldn't be replaced
1198
- elif isinstance(stmt, ir.Assign):
1206
+ elif isinstance(stmt, ir.assign_types):
1199
1207
  stmt.value = replace_vars_inner(stmt.value, var_dict)
1200
1208
  else:
1201
1209
  replace_vars_stmt(stmt, var_dict)
@@ -1209,7 +1217,9 @@ def apply_copy_propagate(
1209
1217
  for l, r in var_dict.copy().items():
1210
1218
  if l in kill_set or r.name in kill_set:
1211
1219
  var_dict.pop(l)
1212
- if isinstance(stmt, ir.Assign) and isinstance(stmt.value, ir.Var):
1220
+ if isinstance(stmt, ir.assign_types) and isinstance(
1221
+ stmt.value, ir.var_types
1222
+ ):
1213
1223
  lhs = stmt.target.name
1214
1224
  rhs = stmt.value.name
1215
1225
  # rhs could be replaced with lhs from previous copies
@@ -1227,8 +1237,8 @@ def apply_copy_propagate(
1227
1237
  lhs_kill.append(k)
1228
1238
  for k in lhs_kill:
1229
1239
  var_dict.pop(k, None)
1230
- if isinstance(stmt, ir.Assign) and not isinstance(
1231
- stmt.value, ir.Var
1240
+ if isinstance(stmt, ir.assign_types) and not isinstance(
1241
+ stmt.value, ir.var_types
1232
1242
  ):
1233
1243
  lhs = stmt.target.name
1234
1244
  var_dict.pop(lhs, None)
@@ -1249,7 +1259,7 @@ def fix_setitem_type(stmt, typemap, calltypes):
1249
1259
  with 'A' layout. The replaced variable can be 'C' or 'F', so we update
1250
1260
  setitem call type reflect this (from matrix power test)
1251
1261
  """
1252
- if not isinstance(stmt, (ir.SetItem, ir.StaticSetItem)):
1262
+ if not isinstance(stmt, ir.setitem_types + ir.staticsetitem_types):
1253
1263
  return
1254
1264
  t_typ = typemap[stmt.target.name]
1255
1265
  s_typ = calltypes[stmt].args[0]
@@ -1304,7 +1314,7 @@ def find_topo_order(blocks, cfg=None):
1304
1314
  seen.add(node)
1305
1315
  succs = cfg._succs[node]
1306
1316
  last_inst = blocks[node].body[-1]
1307
- if isinstance(last_inst, ir.Branch):
1317
+ if isinstance(last_inst, ir.branch_types):
1308
1318
  succs = [last_inst.truebr, last_inst.falsebr]
1309
1319
  for dest in succs:
1310
1320
  if (node, dest) not in cfg._back_edges:
@@ -1351,12 +1361,12 @@ def get_call_table(
1351
1361
 
1352
1362
  for label in reversed(order):
1353
1363
  for inst in reversed(blocks[label].body):
1354
- if isinstance(inst, ir.Assign):
1364
+ if isinstance(inst, ir.assign_types):
1355
1365
  lhs = inst.target.name
1356
1366
  rhs = inst.value
1357
- if isinstance(rhs, ir.Expr) and rhs.op == "call":
1367
+ if isinstance(rhs, ir.expr_types) and rhs.op == "call":
1358
1368
  call_table[rhs.func.name] = []
1359
- if isinstance(rhs, ir.Expr) and rhs.op == "getattr":
1369
+ if isinstance(rhs, ir.expr_types) and rhs.op == "getattr":
1360
1370
  if lhs in call_table:
1361
1371
  call_table[lhs].append(rhs.attr)
1362
1372
  reverse_call_table[rhs.value.name] = lhs
@@ -1364,19 +1374,19 @@ def get_call_table(
1364
1374
  call_var = reverse_call_table[lhs]
1365
1375
  call_table[call_var].append(rhs.attr)
1366
1376
  reverse_call_table[rhs.value.name] = call_var
1367
- if isinstance(rhs, ir.Global):
1377
+ if isinstance(rhs, ir.global_types):
1368
1378
  if lhs in call_table:
1369
1379
  call_table[lhs].append(rhs.value)
1370
1380
  if lhs in reverse_call_table:
1371
1381
  call_var = reverse_call_table[lhs]
1372
1382
  call_table[call_var].append(rhs.value)
1373
- if isinstance(rhs, ir.FreeVar):
1383
+ if isinstance(rhs, ir.freevar_types):
1374
1384
  if lhs in call_table:
1375
1385
  call_table[lhs].append(rhs.value)
1376
1386
  if lhs in reverse_call_table:
1377
1387
  call_var = reverse_call_table[lhs]
1378
1388
  call_table[call_var].append(rhs.value)
1379
- if isinstance(rhs, ir.Var):
1389
+ if isinstance(rhs, ir.var_types):
1380
1390
  if lhs in call_table:
1381
1391
  call_table[lhs].append(rhs.name)
1382
1392
  reverse_call_table[rhs.name] = lhs
@@ -1401,12 +1411,14 @@ def get_tuple_table(blocks, tuple_table=None):
1401
1411
 
1402
1412
  for block in blocks.values():
1403
1413
  for inst in block.body:
1404
- if isinstance(inst, ir.Assign):
1414
+ if isinstance(inst, ir.assign_types):
1405
1415
  lhs = inst.target.name
1406
1416
  rhs = inst.value
1407
- if isinstance(rhs, ir.Expr) and rhs.op == "build_tuple":
1417
+ if isinstance(rhs, ir.expr_types) and rhs.op == "build_tuple":
1408
1418
  tuple_table[lhs] = rhs.items
1409
- if isinstance(rhs, ir.Const) and isinstance(rhs.value, tuple):
1419
+ if isinstance(rhs, ir.const_types) and isinstance(
1420
+ rhs.value, tuple
1421
+ ):
1410
1422
  tuple_table[lhs] = rhs.value
1411
1423
  for T, f in tuple_table_extensions.items():
1412
1424
  if isinstance(inst, T):
@@ -1416,7 +1428,9 @@ def get_tuple_table(blocks, tuple_table=None):
1416
1428
 
1417
1429
  def get_stmt_writes(stmt):
1418
1430
  writes = set()
1419
- if isinstance(stmt, (ir.Assign, ir.SetItem, ir.StaticSetItem)):
1431
+ if isinstance(
1432
+ stmt, ir.assign_types + ir.setitem_types + ir.staticsetitem_types
1433
+ ):
1420
1434
  writes.add(stmt.target.name)
1421
1435
  return writes
1422
1436
 
@@ -1430,7 +1444,7 @@ def rename_labels(blocks):
1430
1444
  # make a block with return last if available (just for readability)
1431
1445
  return_label = -1
1432
1446
  for l, b in blocks.items():
1433
- if isinstance(b.body[-1], ir.Return):
1447
+ if isinstance(b.body[-1], ir.return_types):
1434
1448
  return_label = l
1435
1449
  # some cases like generators can have no return blocks
1436
1450
  if return_label != -1:
@@ -1446,9 +1460,9 @@ def rename_labels(blocks):
1446
1460
  term = b.terminator
1447
1461
  # create new IR nodes instead of mutating the existing one as copies of
1448
1462
  # the IR may also refer to the same nodes!
1449
- if isinstance(term, ir.Jump):
1463
+ if isinstance(term, ir.jump_types):
1450
1464
  b.body[-1] = ir.Jump(label_map[term.target], term.loc)
1451
- if isinstance(term, ir.Branch):
1465
+ if isinstance(term, ir.branch_types):
1452
1466
  b.body[-1] = ir.Branch(
1453
1467
  term.cond,
1454
1468
  label_map[term.truebr],
@@ -1472,7 +1486,9 @@ def simplify_CFG(blocks):
1472
1486
 
1473
1487
  def find_single_branch(label):
1474
1488
  block = blocks[label]
1475
- return len(block.body) == 1 and isinstance(block.body[0], ir.Branch)
1489
+ return len(block.body) == 1 and isinstance(
1490
+ block.body[0], ir.branch_types
1491
+ )
1476
1492
 
1477
1493
  single_branch_blocks = list(filter(find_single_branch, blocks.keys()))
1478
1494
  marked_for_del = set()
@@ -1482,7 +1498,7 @@ def simplify_CFG(blocks):
1482
1498
  delete_block = True
1483
1499
  for p, q in predecessors:
1484
1500
  block = blocks[p]
1485
- if isinstance(block.body[-1], ir.Jump):
1501
+ if isinstance(block.body[-1], ir.jump_types):
1486
1502
  block.body[-1] = copy.copy(inst)
1487
1503
  else:
1488
1504
  delete_block = False
@@ -1523,7 +1539,9 @@ def canonicalize_array_math(func_ir, typemap, calltypes, typingctx):
1523
1539
  block = blocks[label]
1524
1540
  new_body = []
1525
1541
  for stmt in block.body:
1526
- if isinstance(stmt, ir.Assign) and isinstance(stmt.value, ir.Expr):
1542
+ if isinstance(stmt, ir.assign_types) and isinstance(
1543
+ stmt.value, ir.expr_types
1544
+ ):
1527
1545
  lhs = stmt.target.name
1528
1546
  rhs = stmt.value
1529
1547
  # replace A.func with np.func, and save A in saved_arr_arg
@@ -1582,15 +1600,18 @@ def get_array_accesses(blocks, accesses=None):
1582
1600
 
1583
1601
  for block in blocks.values():
1584
1602
  for inst in block.body:
1585
- if isinstance(inst, ir.SetItem):
1603
+ if isinstance(inst, ir.setitem_types):
1586
1604
  accesses.add((inst.target.name, inst.index.name))
1587
- if isinstance(inst, ir.StaticSetItem):
1605
+ if isinstance(inst, ir.staticsetitem_types):
1588
1606
  accesses.add((inst.target.name, inst.index_var.name))
1589
- if isinstance(inst, ir.Assign):
1607
+ if isinstance(inst, ir.assign_types):
1590
1608
  rhs = inst.value
1591
- if isinstance(rhs, ir.Expr) and rhs.op == "getitem":
1609
+ if isinstance(rhs, ir.expr_types) and rhs.op == "getitem":
1592
1610
  accesses.add((rhs.value.name, rhs.index.name))
1593
- if isinstance(rhs, ir.Expr) and rhs.op == "static_getitem":
1611
+ if (
1612
+ isinstance(rhs, ir.expr_types)
1613
+ and rhs.op == "static_getitem"
1614
+ ):
1594
1615
  index = rhs.index
1595
1616
  # slice is unhashable, so just keep the variable
1596
1617
  if index is None or is_slice_index(index):
@@ -1743,7 +1764,7 @@ def build_definitions(blocks, definitions=None):
1743
1764
 
1744
1765
  for block in blocks.values():
1745
1766
  for inst in block.body:
1746
- if isinstance(inst, ir.Assign):
1767
+ if isinstance(inst, ir.assign_types):
1747
1768
  name = inst.target.name
1748
1769
  definition = definitions.get(name, [])
1749
1770
  if definition == []:
@@ -1771,13 +1792,13 @@ def find_callname(
1771
1792
  """
1772
1793
  from numba.cuda.extending import _Intrinsic
1773
1794
 
1774
- require(isinstance(expr, ir.Expr) and expr.op == "call")
1795
+ require(isinstance(expr, ir.expr_types) and expr.op == "call")
1775
1796
  callee = expr.func
1776
1797
  callee_def = definition_finder(func_ir, callee)
1777
1798
  attrs = []
1778
1799
  obj = None
1779
1800
  while True:
1780
- if isinstance(callee_def, (ir.Global, ir.FreeVar)):
1801
+ if isinstance(callee_def, ir.global_types + ir.freevar_types):
1781
1802
  # require(callee_def.value == numpy)
1782
1803
  # these checks support modules like numpy, numpy.random as well as
1783
1804
  # calls like len() and intrinsics like assertEquiv
@@ -1829,7 +1850,9 @@ def find_callname(
1829
1850
  if class_name != "module":
1830
1851
  attrs.append(class_name)
1831
1852
  break
1832
- elif isinstance(callee_def, ir.Expr) and callee_def.op == "getattr":
1853
+ elif (
1854
+ isinstance(callee_def, ir.expr_types) and callee_def.op == "getattr"
1855
+ ):
1833
1856
  obj = callee_def.value
1834
1857
  attrs.append(callee_def.attr)
1835
1858
  if typemap and obj.name in typemap:
@@ -1851,9 +1874,9 @@ def find_build_sequence(func_ir, var):
1851
1874
  operator, or raise GuardException otherwise.
1852
1875
  Note: only build_tuple is immutable, so use with care.
1853
1876
  """
1854
- require(isinstance(var, ir.Var))
1877
+ require(isinstance(var, ir.var_types))
1855
1878
  var_def = get_definition(func_ir, var)
1856
- require(isinstance(var_def, ir.Expr))
1879
+ require(isinstance(var_def, ir.expr_types))
1857
1880
  build_ops = ["build_tuple", "build_list", "build_set"]
1858
1881
  require(var_def.op in build_ops)
1859
1882
  return var_def.items, var_def.op
@@ -1863,9 +1886,11 @@ def find_const(func_ir, var):
1863
1886
  """Check if a variable is defined as constant, and return
1864
1887
  the constant value, or raise GuardException otherwise.
1865
1888
  """
1866
- require(isinstance(var, ir.Var))
1889
+ require(isinstance(var, ir.var_types))
1867
1890
  var_def = get_definition(func_ir, var)
1868
- require(isinstance(var_def, (ir.Const, ir.Global, ir.FreeVar)))
1891
+ require(
1892
+ isinstance(var_def, ir.const_types + ir.global_types + ir.freevar_types)
1893
+ )
1869
1894
  return var_def.value
1870
1895
 
1871
1896
 
@@ -2025,7 +2050,9 @@ def replace_arg_nodes(block, args):
2025
2050
  Replace ir.Arg(...) with variables
2026
2051
  """
2027
2052
  for stmt in block.body:
2028
- if isinstance(stmt, ir.Assign) and isinstance(stmt.value, ir.Arg):
2053
+ if isinstance(stmt, ir.assign_types) and isinstance(
2054
+ stmt.value, ir.arg_types
2055
+ ):
2029
2056
  idx = stmt.value.index
2030
2057
  assert idx < len(args)
2031
2058
  stmt.value = args[idx]
@@ -2041,12 +2068,12 @@ def replace_returns(blocks, target, return_label):
2041
2068
  if not block.body:
2042
2069
  continue
2043
2070
  stmt = block.terminator
2044
- if isinstance(stmt, ir.Return):
2071
+ if isinstance(stmt, ir.return_types):
2045
2072
  block.body.pop() # remove return
2046
2073
  cast_stmt = block.body.pop()
2047
2074
  assert (
2048
- isinstance(cast_stmt, ir.Assign)
2049
- and isinstance(cast_stmt.value, ir.Expr)
2075
+ isinstance(cast_stmt, ir.assign_types)
2076
+ and isinstance(cast_stmt.value, ir.expr_types)
2050
2077
  and cast_stmt.value.op == "cast"
2051
2078
  ), "invalid return cast"
2052
2079
  block.body.append(
@@ -2093,7 +2120,7 @@ def dump_blocks(blocks):
2093
2120
  def is_operator_or_getitem(expr):
2094
2121
  """true if expr is unary or binary operator or getitem"""
2095
2122
  return (
2096
- isinstance(expr, ir.Expr)
2123
+ isinstance(expr, ir.expr_types)
2097
2124
  and getattr(expr, "op", False)
2098
2125
  and expr.op
2099
2126
  in ["unary", "binop", "inplace_binop", "getitem", "static_getitem"]
@@ -2108,15 +2135,15 @@ def is_get_setitem(stmt):
2108
2135
  def is_getitem(stmt):
2109
2136
  """true if stmt is a getitem or static_getitem assignment"""
2110
2137
  return (
2111
- isinstance(stmt, ir.Assign)
2112
- and isinstance(stmt.value, ir.Expr)
2138
+ isinstance(stmt, ir.assign_types)
2139
+ and isinstance(stmt.value, ir.expr_types)
2113
2140
  and stmt.value.op in ["getitem", "static_getitem"]
2114
2141
  )
2115
2142
 
2116
2143
 
2117
2144
  def is_setitem(stmt):
2118
2145
  """true if stmt is a SetItem or StaticSetItem node"""
2119
- return isinstance(stmt, (ir.SetItem, ir.StaticSetItem))
2146
+ return isinstance(stmt, ir.setitem_types + ir.staticsetitem_types)
2120
2147
 
2121
2148
 
2122
2149
  def index_var_of_get_setitem(stmt):
@@ -2128,7 +2155,7 @@ def index_var_of_get_setitem(stmt):
2128
2155
  return stmt.value.index_var
2129
2156
 
2130
2157
  if is_setitem(stmt):
2131
- if isinstance(stmt, ir.SetItem):
2158
+ if isinstance(stmt, ir.setitem_types):
2132
2159
  return stmt.index
2133
2160
  else:
2134
2161
  return stmt.index_var
@@ -2143,7 +2170,7 @@ def set_index_var_of_get_setitem(stmt, new_index):
2143
2170
  else:
2144
2171
  stmt.value.index_var = new_index
2145
2172
  elif is_setitem(stmt):
2146
- if isinstance(stmt, ir.SetItem):
2173
+ if isinstance(stmt, ir.setitem_types):
2147
2174
  stmt.index = new_index
2148
2175
  else:
2149
2176
  stmt.index_var = new_index
@@ -2242,10 +2269,10 @@ def find_outer_value(func_ir, var):
2242
2269
  or raise GuardException otherwise.
2243
2270
  """
2244
2271
  dfn = get_definition(func_ir, var)
2245
- if isinstance(dfn, (ir.Global, ir.FreeVar)):
2272
+ if isinstance(dfn, ir.global_types + ir.freevar_types):
2246
2273
  return dfn.value
2247
2274
 
2248
- if isinstance(dfn, ir.Expr) and dfn.op == "getattr":
2275
+ if isinstance(dfn, ir.expr_types) and dfn.op == "getattr":
2249
2276
  prev_val = find_outer_value(func_ir, dfn.value)
2250
2277
  try:
2251
2278
  val = getattr(prev_val, dfn.attr)
@@ -2288,9 +2315,9 @@ def raise_on_unsupported_feature(func_ir, typemap):
2288
2315
  raise UnsupportedError(msg, func_ir.loc)
2289
2316
 
2290
2317
  for blk in func_ir.blocks.values():
2291
- for stmt in blk.find_insts(ir.Assign):
2318
+ for stmt in blk.find_insts(ir.assign_types):
2292
2319
  # This raises on finding `make_function`
2293
- if isinstance(stmt.value, ir.Expr):
2320
+ if isinstance(stmt.value, ir.expr_types):
2294
2321
  if stmt.value.op == "make_function":
2295
2322
  val = stmt.value
2296
2323
 
@@ -2321,7 +2348,7 @@ def raise_on_unsupported_feature(func_ir, typemap):
2321
2348
  raise UnsupportedError(msg, stmt.value.loc)
2322
2349
 
2323
2350
  # this checks for gdb initialization calls, only one is permitted
2324
- if isinstance(stmt.value, (ir.Global, ir.FreeVar)):
2351
+ if isinstance(stmt.value, ir.global_types + ir.freevar_types):
2325
2352
  val = stmt.value
2326
2353
  val = getattr(val, "value", None)
2327
2354
  if val is None:
@@ -2337,7 +2364,7 @@ def raise_on_unsupported_feature(func_ir, typemap):
2337
2364
  gdb_calls.append(stmt.loc) # report last seen location
2338
2365
 
2339
2366
  # this checks that np.<type> was called if view is called
2340
- if isinstance(stmt.value, ir.Expr):
2367
+ if isinstance(stmt.value, ir.expr_types):
2341
2368
  if stmt.value.op == "getattr" and stmt.value.attr == "view":
2342
2369
  var = stmt.value.value.name
2343
2370
  if isinstance(typemap[var], types.Array):
@@ -2363,7 +2390,7 @@ def raise_on_unsupported_feature(func_ir, typemap):
2363
2390
  )
2364
2391
 
2365
2392
  # checks for globals that are also reflected
2366
- if isinstance(stmt.value, ir.Global):
2393
+ if isinstance(stmt.value, ir.global_types):
2367
2394
  ty = typemap[stmt.target.name]
2368
2395
  msg = (
2369
2396
  "The use of a %s type, assigned to variable '%s' in "
@@ -2380,7 +2407,10 @@ def raise_on_unsupported_feature(func_ir, typemap):
2380
2407
 
2381
2408
  # checks for generator expressions (yield in use when func_ir has
2382
2409
  # not been identified as a generator).
2383
- if isinstance(stmt.value, ir.Yield) and not func_ir.is_generator:
2410
+ if (
2411
+ isinstance(stmt.value, ir.yield_types)
2412
+ and not func_ir.is_generator
2413
+ ):
2384
2414
  msg = "The use of generator expressions is unsupported."
2385
2415
  raise UnsupportedError(msg, loc=stmt.loc)
2386
2416
 
@@ -2443,7 +2473,7 @@ def resolve_func_from_module(func_ir, node):
2443
2473
  except KeyError: # multiple definitions
2444
2474
  return None
2445
2475
  return resolve_mod(mod)
2446
- elif isinstance(mod, (ir.Global, ir.FreeVar)):
2476
+ elif isinstance(mod, ir.global_types + ir.freevar_types):
2447
2477
  if isinstance(mod.value, pytypes.ModuleType):
2448
2478
  return mod
2449
2479
  return None
@@ -2466,7 +2496,7 @@ def enforce_no_dels(func_ir):
2466
2496
  Enforce there being no ir.Del nodes in the IR.
2467
2497
  """
2468
2498
  for blk in func_ir.blocks.values():
2469
- dels = [x for x in blk.find_insts(ir.Del)]
2499
+ dels = [x for x in blk.find_insts(ir.del_types)]
2470
2500
  if dels:
2471
2501
  msg = "Illegal IR, del found at: %s" % dels[0]
2472
2502
  raise CompilerError(msg, loc=dels[0].loc)
@@ -2522,7 +2552,7 @@ def convert_code_obj_to_function(code_obj, caller_ir):
2522
2552
  "are multiple definitions present." % x
2523
2553
  )
2524
2554
  raise TypingError(msg, loc=code_obj.loc)
2525
- if isinstance(freevar_def, ir.Const):
2555
+ if isinstance(freevar_def, ir.const_types):
2526
2556
  freevars.append(freevar_def.value)
2527
2557
  else:
2528
2558
  msg = (
@@ -2619,20 +2649,20 @@ def transfer_scope(block, scope):
2619
2649
 
2620
2650
 
2621
2651
  def is_setup_with(stmt):
2622
- return isinstance(stmt, ir.EnterWith)
2652
+ return isinstance(stmt, ir.enterwith_types)
2623
2653
 
2624
2654
 
2625
2655
  def is_terminator(stmt):
2626
- return isinstance(stmt, ir.Terminator)
2656
+ return isinstance(stmt, ir.terminator_types)
2627
2657
 
2628
2658
 
2629
2659
  def is_raise(stmt):
2630
- return isinstance(stmt, ir.Raise)
2660
+ return isinstance(stmt, ir.raise_types)
2631
2661
 
2632
2662
 
2633
2663
  def is_return(stmt):
2634
- return isinstance(stmt, ir.Return)
2664
+ return isinstance(stmt, ir.return_types)
2635
2665
 
2636
2666
 
2637
2667
  def is_pop_block(stmt):
2638
- return isinstance(stmt, ir.PopBlock)
2668
+ return isinstance(stmt, ir.popblock_types)