numba-cuda 0.21.1__cp313-cp313-win_amd64.whl → 0.24.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 (110) hide show
  1. numba_cuda/VERSION +1 -1
  2. numba_cuda/numba/cuda/__init__.py +4 -1
  3. numba_cuda/numba/cuda/_compat.py +47 -0
  4. numba_cuda/numba/cuda/api.py +4 -1
  5. numba_cuda/numba/cuda/cext/_dispatcher.cp313-win_amd64.pyd +0 -0
  6. numba_cuda/numba/cuda/cext/_dispatcher.cpp +8 -40
  7. numba_cuda/numba/cuda/cext/_hashtable.cpp +5 -0
  8. numba_cuda/numba/cuda/cext/_helperlib.cp313-win_amd64.pyd +0 -0
  9. numba_cuda/numba/cuda/cext/_pymodule.h +1 -1
  10. numba_cuda/numba/cuda/cext/_typeconv.cp313-win_amd64.pyd +0 -0
  11. numba_cuda/numba/cuda/cext/_typeof.cpp +56 -119
  12. numba_cuda/numba/cuda/cext/mviewbuf.c +7 -1
  13. numba_cuda/numba/cuda/cext/mviewbuf.cp313-win_amd64.pyd +0 -0
  14. numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +4 -5
  15. numba_cuda/numba/cuda/codegen.py +46 -12
  16. numba_cuda/numba/cuda/compiler.py +15 -9
  17. numba_cuda/numba/cuda/core/analysis.py +29 -21
  18. numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +1 -1
  19. numba_cuda/numba/cuda/core/annotations/type_annotations.py +4 -4
  20. numba_cuda/numba/cuda/core/base.py +12 -11
  21. numba_cuda/numba/cuda/core/bytecode.py +21 -13
  22. numba_cuda/numba/cuda/core/byteflow.py +336 -90
  23. numba_cuda/numba/cuda/core/compiler.py +3 -4
  24. numba_cuda/numba/cuda/core/compiler_machinery.py +3 -3
  25. numba_cuda/numba/cuda/core/config.py +5 -7
  26. numba_cuda/numba/cuda/core/consts.py +1 -1
  27. numba_cuda/numba/cuda/core/controlflow.py +17 -9
  28. numba_cuda/numba/cuda/core/cuda_errors.py +917 -0
  29. numba_cuda/numba/cuda/core/errors.py +4 -912
  30. numba_cuda/numba/cuda/core/inline_closurecall.py +82 -67
  31. numba_cuda/numba/cuda/core/interpreter.py +334 -160
  32. numba_cuda/numba/cuda/core/ir.py +191 -119
  33. numba_cuda/numba/cuda/core/ir_utils.py +149 -128
  34. numba_cuda/numba/cuda/core/postproc.py +8 -8
  35. numba_cuda/numba/cuda/core/pythonapi.py +3 -0
  36. numba_cuda/numba/cuda/core/rewrites/ir_print.py +6 -3
  37. numba_cuda/numba/cuda/core/rewrites/static_binop.py +1 -1
  38. numba_cuda/numba/cuda/core/rewrites/static_getitem.py +5 -5
  39. numba_cuda/numba/cuda/core/rewrites/static_raise.py +3 -3
  40. numba_cuda/numba/cuda/core/ssa.py +5 -5
  41. numba_cuda/numba/cuda/core/transforms.py +29 -16
  42. numba_cuda/numba/cuda/core/typed_passes.py +10 -10
  43. numba_cuda/numba/cuda/core/typeinfer.py +42 -27
  44. numba_cuda/numba/cuda/core/untyped_passes.py +82 -65
  45. numba_cuda/numba/cuda/cpython/unicode.py +2 -2
  46. numba_cuda/numba/cuda/cpython/unicode_support.py +1 -3
  47. numba_cuda/numba/cuda/cudadecl.py +0 -13
  48. numba_cuda/numba/cuda/cudadrv/devicearray.py +10 -9
  49. numba_cuda/numba/cuda/cudadrv/driver.py +142 -519
  50. numba_cuda/numba/cuda/cudadrv/dummyarray.py +4 -0
  51. numba_cuda/numba/cuda/cudadrv/nvrtc.py +87 -32
  52. numba_cuda/numba/cuda/cudaimpl.py +0 -12
  53. numba_cuda/numba/cuda/debuginfo.py +25 -0
  54. numba_cuda/numba/cuda/descriptor.py +1 -1
  55. numba_cuda/numba/cuda/device_init.py +4 -7
  56. numba_cuda/numba/cuda/deviceufunc.py +3 -6
  57. numba_cuda/numba/cuda/dispatcher.py +39 -49
  58. numba_cuda/numba/cuda/intrinsics.py +150 -1
  59. numba_cuda/numba/cuda/libdeviceimpl.py +1 -2
  60. numba_cuda/numba/cuda/lowering.py +36 -29
  61. numba_cuda/numba/cuda/memory_management/nrt.py +10 -14
  62. numba_cuda/numba/cuda/np/arrayobj.py +61 -9
  63. numba_cuda/numba/cuda/np/numpy_support.py +32 -9
  64. numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +4 -3
  65. numba_cuda/numba/cuda/printimpl.py +20 -0
  66. numba_cuda/numba/cuda/serialize.py +10 -0
  67. numba_cuda/numba/cuda/stubs.py +0 -11
  68. numba_cuda/numba/cuda/testing.py +4 -8
  69. numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +21 -4
  70. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +1 -2
  71. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +195 -51
  72. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +6 -2
  73. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +3 -1
  74. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +1 -1
  75. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +6 -7
  76. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +11 -12
  77. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +53 -23
  78. numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +61 -9
  79. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +6 -0
  80. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +47 -0
  81. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +22 -1
  82. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +13 -0
  83. numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +1 -1
  84. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +1 -1
  85. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +94 -0
  86. numba_cuda/numba/cuda/tests/cudapy/test_device_array_capture.py +243 -0
  87. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +3 -3
  88. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1 -1
  89. numba_cuda/numba/cuda/tests/cudapy/test_numba_interop.py +35 -0
  90. numba_cuda/numba/cuda/tests/cudapy/test_print.py +51 -0
  91. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +37 -35
  92. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +117 -1
  93. numba_cuda/numba/cuda/tests/doc_examples/test_globals.py +111 -0
  94. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +61 -0
  95. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +31 -0
  96. numba_cuda/numba/cuda/tests/support.py +11 -0
  97. numba_cuda/numba/cuda/types/cuda_functions.py +1 -1
  98. numba_cuda/numba/cuda/typing/asnumbatype.py +37 -2
  99. numba_cuda/numba/cuda/typing/context.py +3 -1
  100. numba_cuda/numba/cuda/typing/typeof.py +51 -2
  101. {numba_cuda-0.21.1.dist-info → numba_cuda-0.24.0.dist-info}/METADATA +4 -13
  102. {numba_cuda-0.21.1.dist-info → numba_cuda-0.24.0.dist-info}/RECORD +106 -105
  103. numba_cuda/numba/cuda/cext/_devicearray.cp313-win_amd64.pyd +0 -0
  104. numba_cuda/numba/cuda/cext/_devicearray.cpp +0 -159
  105. numba_cuda/numba/cuda/cext/_devicearray.h +0 -29
  106. numba_cuda/numba/cuda/intrinsic_wrapper.py +0 -41
  107. {numba_cuda-0.21.1.dist-info → numba_cuda-0.24.0.dist-info}/WHEEL +0 -0
  108. {numba_cuda-0.21.1.dist-info → numba_cuda-0.24.0.dist-info}/licenses/LICENSE +0 -0
  109. {numba_cuda-0.21.1.dist-info → numba_cuda-0.24.0.dist-info}/licenses/LICENSE.numba +0 -0
  110. {numba_cuda-0.21.1.dist-info → numba_cuda-0.24.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)
@@ -389,13 +389,10 @@ def get_name_var_table(blocks):
389
389
  def replace_var_names(blocks, namedict):
390
390
  """replace variables (ir.Var to ir.Var) from dictionary (name -> name)"""
391
391
  # remove identity values to avoid infinite loop
392
- new_namedict = {}
393
- for l, r in namedict.items():
394
- if l != r:
395
- new_namedict[l] = r
392
+ new_namedict = {l: r for l, r in namedict.items() if l != r}
396
393
 
397
394
  def replace_name(var, namedict):
398
- assert isinstance(var, ir.Var)
395
+ assert isinstance(var, ir.var_types)
399
396
  while var.name in namedict:
400
397
  var = ir.Var(var.scope, namedict[var.name], var.loc)
401
398
  return var
@@ -404,7 +401,7 @@ def replace_var_names(blocks, namedict):
404
401
 
405
402
 
406
403
  def replace_var_callback(var, vardict):
407
- assert isinstance(var, ir.Var)
404
+ assert isinstance(var, ir.var_types)
408
405
  while var.name in vardict.keys():
409
406
  assert vardict[var.name].name != var.name
410
407
  new_var = vardict[var.name]
@@ -415,10 +412,7 @@ def replace_var_callback(var, vardict):
415
412
  def replace_vars(blocks, vardict):
416
413
  """replace variables (ir.Var to ir.Var) from dictionary (name -> ir.Var)"""
417
414
  # remove identity values to avoid infinite loop
418
- new_vardict = {}
419
- for l, r in vardict.items():
420
- if l != r.name:
421
- new_vardict[l] = r
415
+ new_vardict = {l: r for l, r in vardict.items() if l != r.name}
422
416
  visit_vars(blocks, replace_var_callback, new_vardict)
423
417
 
424
418
 
@@ -451,44 +445,44 @@ def visit_vars_stmt(stmt, callback, cbdata):
451
445
  if isinstance(stmt, t):
452
446
  f(stmt, callback, cbdata)
453
447
  return
454
- if isinstance(stmt, ir.Assign):
448
+ if isinstance(stmt, ir.assign_types):
455
449
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
456
450
  stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
457
- elif isinstance(stmt, ir.Arg):
451
+ elif isinstance(stmt, ir.arg_types):
458
452
  stmt.name = visit_vars_inner(stmt.name, callback, cbdata)
459
- elif isinstance(stmt, ir.Return):
453
+ elif isinstance(stmt, ir.return_types):
460
454
  stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
461
- elif isinstance(stmt, ir.Raise):
455
+ elif isinstance(stmt, ir.raise_types):
462
456
  stmt.exception = visit_vars_inner(stmt.exception, callback, cbdata)
463
- elif isinstance(stmt, ir.Branch):
457
+ elif isinstance(stmt, ir.branch_types):
464
458
  stmt.cond = visit_vars_inner(stmt.cond, callback, cbdata)
465
- elif isinstance(stmt, ir.Jump):
459
+ elif isinstance(stmt, ir.jump_types):
466
460
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
467
- elif isinstance(stmt, ir.Del):
461
+ elif isinstance(stmt, ir.del_types):
468
462
  # Because Del takes only a var name, we make up by
469
463
  # constructing a temporary variable.
470
464
  var = ir.Var(None, stmt.value, stmt.loc)
471
465
  var = visit_vars_inner(var, callback, cbdata)
472
466
  stmt.value = var.name
473
- elif isinstance(stmt, ir.DelAttr):
467
+ elif isinstance(stmt, ir.delattr_types):
474
468
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
475
469
  stmt.attr = visit_vars_inner(stmt.attr, callback, cbdata)
476
- elif isinstance(stmt, ir.SetAttr):
470
+ elif isinstance(stmt, ir.setattr_types):
477
471
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
478
472
  stmt.attr = visit_vars_inner(stmt.attr, callback, cbdata)
479
473
  stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
480
- elif isinstance(stmt, ir.DelItem):
474
+ elif isinstance(stmt, ir.delitem_types):
481
475
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
482
476
  stmt.index = visit_vars_inner(stmt.index, callback, cbdata)
483
- elif isinstance(stmt, ir.StaticSetItem):
477
+ elif isinstance(stmt, ir.staticsetitem_types):
484
478
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
485
479
  stmt.index_var = visit_vars_inner(stmt.index_var, callback, cbdata)
486
480
  stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
487
- elif isinstance(stmt, ir.SetItem):
481
+ elif isinstance(stmt, ir.setitem_types):
488
482
  stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
489
483
  stmt.index = visit_vars_inner(stmt.index, callback, cbdata)
490
484
  stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
491
- elif isinstance(stmt, ir.Print):
485
+ elif isinstance(stmt, ir.print_types):
492
486
  stmt.args = [visit_vars_inner(x, callback, cbdata) for x in stmt.args]
493
487
  else:
494
488
  # TODO: raise NotImplementedError("no replacement for IR node: ", stmt)
@@ -497,13 +491,13 @@ def visit_vars_stmt(stmt, callback, cbdata):
497
491
 
498
492
 
499
493
  def visit_vars_inner(node, callback, cbdata):
500
- if isinstance(node, ir.Var):
494
+ if isinstance(node, ir.var_types):
501
495
  return callback(node, cbdata)
502
496
  elif isinstance(node, list):
503
497
  return [visit_vars_inner(n, callback, cbdata) for n in node]
504
498
  elif isinstance(node, tuple):
505
499
  return tuple([visit_vars_inner(n, callback, cbdata) for n in node])
506
- elif isinstance(node, ir.Expr):
500
+ elif isinstance(node, ir.expr_types):
507
501
  # if node.op in ['binop', 'inplace_binop']:
508
502
  # lhs = node.lhs.name
509
503
  # rhs = node.rhs.name
@@ -511,7 +505,7 @@ def visit_vars_inner(node, callback, cbdata):
511
505
  # node.rhs.name = callback, cbdata.get(rhs, rhs)
512
506
  for arg in node._kws.keys():
513
507
  node._kws[arg] = visit_vars_inner(node._kws[arg], callback, cbdata)
514
- elif isinstance(node, ir.Yield):
508
+ elif isinstance(node, ir.yield_types):
515
509
  node.value = visit_vars_inner(node.value, callback, cbdata)
516
510
  return node
517
511
 
@@ -531,9 +525,9 @@ def add_offset_to_labels(blocks, offset):
531
525
  for T, f in add_offset_to_labels_extensions.items():
532
526
  if isinstance(inst, T):
533
527
  f(inst, offset)
534
- if isinstance(term, ir.Jump):
528
+ if isinstance(term, ir.jump_types):
535
529
  b.body[-1] = ir.Jump(term.target + offset, term.loc)
536
- if isinstance(term, ir.Branch):
530
+ if isinstance(term, ir.branch_types):
537
531
  b.body[-1] = ir.Branch(
538
532
  term.cond, term.truebr + offset, term.falsebr + offset, term.loc
539
533
  )
@@ -578,9 +572,9 @@ def flatten_labels(blocks):
578
572
  term = None
579
573
  if b.body:
580
574
  term = b.body[-1]
581
- if isinstance(term, ir.Jump):
575
+ if isinstance(term, ir.jump_types):
582
576
  b.body[-1] = ir.Jump(l_map[term.target], term.loc)
583
- if isinstance(term, ir.Branch):
577
+ if isinstance(term, ir.branch_types):
584
578
  b.body[-1] = ir.Branch(
585
579
  term.cond, l_map[term.truebr], l_map[term.falsebr], term.loc
586
580
  )
@@ -591,11 +585,9 @@ def flatten_labels(blocks):
591
585
  def remove_dels(blocks):
592
586
  """remove ir.Del nodes"""
593
587
  for block in blocks.values():
594
- new_body = []
595
- for stmt in block.body:
596
- if not isinstance(stmt, ir.Del):
597
- new_body.append(stmt)
598
- block.body = new_body
588
+ block.body = [
589
+ stmt for stmt in block.body if not isinstance(stmt, ir.del_types)
590
+ ]
599
591
  return
600
592
 
601
593
 
@@ -604,7 +596,9 @@ def remove_args(blocks):
604
596
  for block in blocks.values():
605
597
  new_body = []
606
598
  for stmt in block.body:
607
- if isinstance(stmt, ir.Assign) and isinstance(stmt.value, ir.Arg):
599
+ if isinstance(stmt, ir.assign_types) and isinstance(
600
+ stmt.value, ir.arg_types
601
+ ):
608
602
  continue
609
603
  new_body.append(stmt)
610
604
  block.body = new_body
@@ -737,7 +731,7 @@ def remove_dead_block(
737
731
  continue
738
732
 
739
733
  # ignore assignments that their lhs is not live or lhs==rhs
740
- if isinstance(stmt, ir.Assign):
734
+ if isinstance(stmt, ir.assign_types):
741
735
  lhs = stmt.target
742
736
  rhs = stmt.value
743
737
  if lhs.name not in lives and has_no_side_effect(
@@ -747,21 +741,21 @@ def remove_dead_block(
747
741
  print("Statement was removed.")
748
742
  removed = True
749
743
  continue
750
- if isinstance(rhs, ir.Var) and lhs.name == rhs.name:
744
+ if isinstance(rhs, ir.var_types) and lhs.name == rhs.name:
751
745
  if config.DEBUG_ARRAY_OPT >= 2:
752
746
  print("Statement was removed.")
753
747
  removed = True
754
748
  continue
755
749
  # TODO: remove other nodes like SetItem etc.
756
750
 
757
- if isinstance(stmt, ir.Del):
751
+ if isinstance(stmt, ir.del_types):
758
752
  if stmt.value not in lives:
759
753
  if config.DEBUG_ARRAY_OPT >= 2:
760
754
  print("Statement was removed.")
761
755
  removed = True
762
756
  continue
763
757
 
764
- if isinstance(stmt, ir.SetItem):
758
+ if isinstance(stmt, ir.setitem_types):
765
759
  name = stmt.target.name
766
760
  if name not in lives_n_aliases:
767
761
  if config.DEBUG_ARRAY_OPT >= 2:
@@ -775,9 +769,9 @@ def remove_dead_block(
775
769
  lives |= uses
776
770
  else:
777
771
  lives |= {v.name for v in stmt.list_vars()}
778
- if isinstance(stmt, ir.Assign):
772
+ if isinstance(stmt, ir.assign_types):
779
773
  # make sure lhs is not used in rhs, e.g. a = g(a)
780
- if isinstance(stmt.value, ir.Expr):
774
+ if isinstance(stmt.value, ir.expr_types):
781
775
  rhs_vars = {v.name for v in stmt.value.list_vars()}
782
776
  if lhs.name not in rhs_vars:
783
777
  lives.remove(lhs.name)
@@ -809,7 +803,7 @@ def has_no_side_effect(rhs, lives, call_table):
809
803
  """
810
804
  from numba.cuda.extending import _Intrinsic
811
805
 
812
- if isinstance(rhs, ir.Expr) and rhs.op == "call":
806
+ if isinstance(rhs, ir.expr_types) and rhs.op == "call":
813
807
  func_name = rhs.func.name
814
808
  if func_name not in call_table or call_table[func_name] == []:
815
809
  return False
@@ -843,11 +837,11 @@ def has_no_side_effect(rhs, lives, call_table):
843
837
  if f(rhs, lives, call_list):
844
838
  return True
845
839
  return False
846
- if isinstance(rhs, ir.Expr) and rhs.op == "inplace_binop":
840
+ if isinstance(rhs, ir.expr_types) and rhs.op == "inplace_binop":
847
841
  return rhs.lhs.name not in lives
848
- if isinstance(rhs, ir.Yield):
842
+ if isinstance(rhs, ir.yield_types):
849
843
  return False
850
- if isinstance(rhs, ir.Expr) and rhs.op == "pair_first":
844
+ if isinstance(rhs, ir.expr_types) and rhs.op == "pair_first":
851
845
  # don't remove pair_first since prange looks for it
852
846
  return False
853
847
  return True
@@ -861,7 +855,7 @@ def is_pure(rhs, lives, call_table):
861
855
  returns the same result. This is not the case for things
862
856
  like calls to numpy.random.
863
857
  """
864
- if isinstance(rhs, ir.Expr):
858
+ if isinstance(rhs, ir.expr_types):
865
859
  if rhs.op == "call":
866
860
  func_name = rhs.func.name
867
861
  if func_name not in call_table or call_table[func_name] == []:
@@ -882,7 +876,7 @@ def is_pure(rhs, lives, call_table):
882
876
  return False
883
877
  elif rhs.op == "getiter" or rhs.op == "iternext":
884
878
  return False
885
- if isinstance(rhs, ir.Yield):
879
+ if isinstance(rhs, ir.yield_types):
886
880
  return False
887
881
  return True
888
882
 
@@ -926,39 +920,42 @@ def find_potential_aliases(
926
920
  if type(instr) in alias_analysis_extensions:
927
921
  f = alias_analysis_extensions[type(instr)]
928
922
  f(instr, args, typemap, func_ir, alias_map, arg_aliases)
929
- if isinstance(instr, ir.Assign):
923
+ if isinstance(instr, ir.assign_types):
930
924
  expr = instr.value
931
925
  lhs = instr.target.name
932
926
  # only mutable types can alias
933
927
  if is_immutable_type(lhs, typemap):
934
928
  continue
935
- if isinstance(expr, ir.Var) and lhs != expr.name:
929
+ if isinstance(expr, ir.var_types) and lhs != expr.name:
936
930
  _add_alias(lhs, expr.name, alias_map, arg_aliases)
937
931
  # subarrays like A = B[0] for 2D B
938
- if isinstance(expr, ir.Expr) and (
932
+ if isinstance(expr, ir.expr_types) and (
939
933
  expr.op == "cast"
940
934
  or expr.op in ["getitem", "static_getitem"]
941
935
  ):
942
936
  _add_alias(lhs, expr.value.name, alias_map, arg_aliases)
943
- if isinstance(expr, ir.Expr) and expr.op == "inplace_binop":
937
+ if (
938
+ isinstance(expr, ir.expr_types)
939
+ and expr.op == "inplace_binop"
940
+ ):
944
941
  _add_alias(lhs, expr.lhs.name, alias_map, arg_aliases)
945
942
  # array attributes like A.T
946
943
  if (
947
- isinstance(expr, ir.Expr)
944
+ isinstance(expr, ir.expr_types)
948
945
  and expr.op == "getattr"
949
946
  and expr.attr in ["T", "ctypes", "flat"]
950
947
  ):
951
948
  _add_alias(lhs, expr.value.name, alias_map, arg_aliases)
952
949
  # a = b.c. a should alias b
953
950
  if (
954
- isinstance(expr, ir.Expr)
951
+ isinstance(expr, ir.expr_types)
955
952
  and expr.op == "getattr"
956
953
  and expr.attr not in ["shape"]
957
954
  and expr.value.name in arg_aliases
958
955
  ):
959
956
  _add_alias(lhs, expr.value.name, alias_map, arg_aliases)
960
957
  # calls that can create aliases such as B = A.ravel()
961
- if isinstance(expr, ir.Expr) and expr.op == "call":
958
+ if isinstance(expr, ir.expr_types) and expr.op == "call":
962
959
  fdef = guard(find_callname, func_ir, expr, typemap)
963
960
  # TODO: sometimes gufunc backend creates duplicate code
964
961
  # causing find_callname to fail. Example: test_argmax
@@ -974,7 +971,10 @@ def find_potential_aliases(
974
971
  _add_alias(
975
972
  lhs, expr.args[0].name, alias_map, arg_aliases
976
973
  )
977
- if isinstance(fmod, ir.Var) and fname in np_alias_funcs:
974
+ if (
975
+ isinstance(fmod, ir.var_types)
976
+ and fname in np_alias_funcs
977
+ ):
978
978
  _add_alias(lhs, fmod.name, alias_map, arg_aliases)
979
979
 
980
980
  # copy to avoid changing size during iteration
@@ -1068,7 +1068,7 @@ def init_copy_propagate_data(blocks, entry, typemap):
1068
1068
  gen_copies, extra_kill = get_block_copies(blocks, typemap)
1069
1069
  # set of all program copies
1070
1070
  all_copies = set()
1071
- for l, s in gen_copies.items():
1071
+ for l in gen_copies.keys():
1072
1072
  all_copies |= gen_copies[l]
1073
1073
  kill_copies = {}
1074
1074
  for label, gen_set in gen_copies.items():
@@ -1114,8 +1114,7 @@ def get_block_copies(blocks, typemap):
1114
1114
  for T, f in copy_propagate_extensions.items():
1115
1115
  if isinstance(stmt, T):
1116
1116
  gen_set, kill_set = f(stmt, typemap)
1117
- for lhs, rhs in gen_set:
1118
- assign_dict[lhs] = rhs
1117
+ assign_dict.update(gen_set)
1119
1118
  # if a=b is in dict and b is killed, a is also killed
1120
1119
  new_assign_dict = {}
1121
1120
  for l, r in assign_dict.items():
@@ -1125,9 +1124,9 @@ def get_block_copies(blocks, typemap):
1125
1124
  extra_kill[label].add(l)
1126
1125
  assign_dict = new_assign_dict
1127
1126
  extra_kill[label] |= kill_set
1128
- if isinstance(stmt, ir.Assign):
1127
+ if isinstance(stmt, ir.assign_types):
1129
1128
  lhs = stmt.target.name
1130
- if isinstance(stmt.value, ir.Var):
1129
+ if isinstance(stmt.value, ir.var_types):
1131
1130
  rhs = stmt.value.name
1132
1131
  # copy is valid only if same type (see
1133
1132
  # TestCFunc.test_locals)
@@ -1139,7 +1138,7 @@ def get_block_copies(blocks, typemap):
1139
1138
  assign_dict[lhs] = rhs
1140
1139
  continue
1141
1140
  if (
1142
- isinstance(stmt.value, ir.Expr)
1141
+ isinstance(stmt.value, ir.expr_types)
1143
1142
  and stmt.value.op == "inplace_binop"
1144
1143
  ):
1145
1144
  in1_var = stmt.value.lhs.name
@@ -1195,7 +1194,7 @@ def apply_copy_propagate(
1195
1194
  )
1196
1195
  # only rhs of assignments should be replaced
1197
1196
  # e.g. if x=y is available, x in x=z shouldn't be replaced
1198
- elif isinstance(stmt, ir.Assign):
1197
+ elif isinstance(stmt, ir.assign_types):
1199
1198
  stmt.value = replace_vars_inner(stmt.value, var_dict)
1200
1199
  else:
1201
1200
  replace_vars_stmt(stmt, var_dict)
@@ -1209,7 +1208,9 @@ def apply_copy_propagate(
1209
1208
  for l, r in var_dict.copy().items():
1210
1209
  if l in kill_set or r.name in kill_set:
1211
1210
  var_dict.pop(l)
1212
- if isinstance(stmt, ir.Assign) and isinstance(stmt.value, ir.Var):
1211
+ if isinstance(stmt, ir.assign_types) and isinstance(
1212
+ stmt.value, ir.var_types
1213
+ ):
1213
1214
  lhs = stmt.target.name
1214
1215
  rhs = stmt.value.name
1215
1216
  # rhs could be replaced with lhs from previous copies
@@ -1227,8 +1228,8 @@ def apply_copy_propagate(
1227
1228
  lhs_kill.append(k)
1228
1229
  for k in lhs_kill:
1229
1230
  var_dict.pop(k, None)
1230
- if isinstance(stmt, ir.Assign) and not isinstance(
1231
- stmt.value, ir.Var
1231
+ if isinstance(stmt, ir.assign_types) and not isinstance(
1232
+ stmt.value, ir.var_types
1232
1233
  ):
1233
1234
  lhs = stmt.target.name
1234
1235
  var_dict.pop(lhs, None)
@@ -1249,7 +1250,7 @@ def fix_setitem_type(stmt, typemap, calltypes):
1249
1250
  with 'A' layout. The replaced variable can be 'C' or 'F', so we update
1250
1251
  setitem call type reflect this (from matrix power test)
1251
1252
  """
1252
- if not isinstance(stmt, (ir.SetItem, ir.StaticSetItem)):
1253
+ if not isinstance(stmt, ir.setitem_types + ir.staticsetitem_types):
1253
1254
  return
1254
1255
  t_typ = typemap[stmt.target.name]
1255
1256
  s_typ = calltypes[stmt].args[0]
@@ -1304,7 +1305,7 @@ def find_topo_order(blocks, cfg=None):
1304
1305
  seen.add(node)
1305
1306
  succs = cfg._succs[node]
1306
1307
  last_inst = blocks[node].body[-1]
1307
- if isinstance(last_inst, ir.Branch):
1308
+ if isinstance(last_inst, ir.branch_types):
1308
1309
  succs = [last_inst.truebr, last_inst.falsebr]
1309
1310
  for dest in succs:
1310
1311
  if (node, dest) not in cfg._back_edges:
@@ -1351,12 +1352,12 @@ def get_call_table(
1351
1352
 
1352
1353
  for label in reversed(order):
1353
1354
  for inst in reversed(blocks[label].body):
1354
- if isinstance(inst, ir.Assign):
1355
+ if isinstance(inst, ir.assign_types):
1355
1356
  lhs = inst.target.name
1356
1357
  rhs = inst.value
1357
- if isinstance(rhs, ir.Expr) and rhs.op == "call":
1358
+ if isinstance(rhs, ir.expr_types) and rhs.op == "call":
1358
1359
  call_table[rhs.func.name] = []
1359
- if isinstance(rhs, ir.Expr) and rhs.op == "getattr":
1360
+ if isinstance(rhs, ir.expr_types) and rhs.op == "getattr":
1360
1361
  if lhs in call_table:
1361
1362
  call_table[lhs].append(rhs.attr)
1362
1363
  reverse_call_table[rhs.value.name] = lhs
@@ -1364,19 +1365,19 @@ def get_call_table(
1364
1365
  call_var = reverse_call_table[lhs]
1365
1366
  call_table[call_var].append(rhs.attr)
1366
1367
  reverse_call_table[rhs.value.name] = call_var
1367
- if isinstance(rhs, ir.Global):
1368
+ if isinstance(rhs, ir.global_types):
1368
1369
  if lhs in call_table:
1369
1370
  call_table[lhs].append(rhs.value)
1370
1371
  if lhs in reverse_call_table:
1371
1372
  call_var = reverse_call_table[lhs]
1372
1373
  call_table[call_var].append(rhs.value)
1373
- if isinstance(rhs, ir.FreeVar):
1374
+ if isinstance(rhs, ir.freevar_types):
1374
1375
  if lhs in call_table:
1375
1376
  call_table[lhs].append(rhs.value)
1376
1377
  if lhs in reverse_call_table:
1377
1378
  call_var = reverse_call_table[lhs]
1378
1379
  call_table[call_var].append(rhs.value)
1379
- if isinstance(rhs, ir.Var):
1380
+ if isinstance(rhs, ir.var_types):
1380
1381
  if lhs in call_table:
1381
1382
  call_table[lhs].append(rhs.name)
1382
1383
  reverse_call_table[rhs.name] = lhs
@@ -1401,12 +1402,14 @@ def get_tuple_table(blocks, tuple_table=None):
1401
1402
 
1402
1403
  for block in blocks.values():
1403
1404
  for inst in block.body:
1404
- if isinstance(inst, ir.Assign):
1405
+ if isinstance(inst, ir.assign_types):
1405
1406
  lhs = inst.target.name
1406
1407
  rhs = inst.value
1407
- if isinstance(rhs, ir.Expr) and rhs.op == "build_tuple":
1408
+ if isinstance(rhs, ir.expr_types) and rhs.op == "build_tuple":
1408
1409
  tuple_table[lhs] = rhs.items
1409
- if isinstance(rhs, ir.Const) and isinstance(rhs.value, tuple):
1410
+ if isinstance(rhs, ir.const_types) and isinstance(
1411
+ rhs.value, tuple
1412
+ ):
1410
1413
  tuple_table[lhs] = rhs.value
1411
1414
  for T, f in tuple_table_extensions.items():
1412
1415
  if isinstance(inst, T):
@@ -1416,7 +1419,9 @@ def get_tuple_table(blocks, tuple_table=None):
1416
1419
 
1417
1420
  def get_stmt_writes(stmt):
1418
1421
  writes = set()
1419
- if isinstance(stmt, (ir.Assign, ir.SetItem, ir.StaticSetItem)):
1422
+ if isinstance(
1423
+ stmt, ir.assign_types + ir.setitem_types + ir.staticsetitem_types
1424
+ ):
1420
1425
  writes.add(stmt.target.name)
1421
1426
  return writes
1422
1427
 
@@ -1430,7 +1435,7 @@ def rename_labels(blocks):
1430
1435
  # make a block with return last if available (just for readability)
1431
1436
  return_label = -1
1432
1437
  for l, b in blocks.items():
1433
- if isinstance(b.body[-1], ir.Return):
1438
+ if isinstance(b.body[-1], ir.return_types):
1434
1439
  return_label = l
1435
1440
  # some cases like generators can have no return blocks
1436
1441
  if return_label != -1:
@@ -1446,9 +1451,9 @@ def rename_labels(blocks):
1446
1451
  term = b.terminator
1447
1452
  # create new IR nodes instead of mutating the existing one as copies of
1448
1453
  # the IR may also refer to the same nodes!
1449
- if isinstance(term, ir.Jump):
1454
+ if isinstance(term, ir.jump_types):
1450
1455
  b.body[-1] = ir.Jump(label_map[term.target], term.loc)
1451
- if isinstance(term, ir.Branch):
1456
+ if isinstance(term, ir.branch_types):
1452
1457
  b.body[-1] = ir.Branch(
1453
1458
  term.cond,
1454
1459
  label_map[term.truebr],
@@ -1472,7 +1477,9 @@ def simplify_CFG(blocks):
1472
1477
 
1473
1478
  def find_single_branch(label):
1474
1479
  block = blocks[label]
1475
- return len(block.body) == 1 and isinstance(block.body[0], ir.Branch)
1480
+ return len(block.body) == 1 and isinstance(
1481
+ block.body[0], ir.branch_types
1482
+ )
1476
1483
 
1477
1484
  single_branch_blocks = list(filter(find_single_branch, blocks.keys()))
1478
1485
  marked_for_del = set()
@@ -1482,7 +1489,7 @@ def simplify_CFG(blocks):
1482
1489
  delete_block = True
1483
1490
  for p, q in predecessors:
1484
1491
  block = blocks[p]
1485
- if isinstance(block.body[-1], ir.Jump):
1492
+ if isinstance(block.body[-1], ir.jump_types):
1486
1493
  block.body[-1] = copy.copy(inst)
1487
1494
  else:
1488
1495
  delete_block = False
@@ -1523,7 +1530,9 @@ def canonicalize_array_math(func_ir, typemap, calltypes, typingctx):
1523
1530
  block = blocks[label]
1524
1531
  new_body = []
1525
1532
  for stmt in block.body:
1526
- if isinstance(stmt, ir.Assign) and isinstance(stmt.value, ir.Expr):
1533
+ if isinstance(stmt, ir.assign_types) and isinstance(
1534
+ stmt.value, ir.expr_types
1535
+ ):
1527
1536
  lhs = stmt.target.name
1528
1537
  rhs = stmt.value
1529
1538
  # replace A.func with np.func, and save A in saved_arr_arg
@@ -1582,15 +1591,18 @@ def get_array_accesses(blocks, accesses=None):
1582
1591
 
1583
1592
  for block in blocks.values():
1584
1593
  for inst in block.body:
1585
- if isinstance(inst, ir.SetItem):
1594
+ if isinstance(inst, ir.setitem_types):
1586
1595
  accesses.add((inst.target.name, inst.index.name))
1587
- if isinstance(inst, ir.StaticSetItem):
1596
+ if isinstance(inst, ir.staticsetitem_types):
1588
1597
  accesses.add((inst.target.name, inst.index_var.name))
1589
- if isinstance(inst, ir.Assign):
1598
+ if isinstance(inst, ir.assign_types):
1590
1599
  rhs = inst.value
1591
- if isinstance(rhs, ir.Expr) and rhs.op == "getitem":
1600
+ if isinstance(rhs, ir.expr_types) and rhs.op == "getitem":
1592
1601
  accesses.add((rhs.value.name, rhs.index.name))
1593
- if isinstance(rhs, ir.Expr) and rhs.op == "static_getitem":
1602
+ if (
1603
+ isinstance(rhs, ir.expr_types)
1604
+ and rhs.op == "static_getitem"
1605
+ ):
1594
1606
  index = rhs.index
1595
1607
  # slice is unhashable, so just keep the variable
1596
1608
  if index is None or is_slice_index(index):
@@ -1743,7 +1755,7 @@ def build_definitions(blocks, definitions=None):
1743
1755
 
1744
1756
  for block in blocks.values():
1745
1757
  for inst in block.body:
1746
- if isinstance(inst, ir.Assign):
1758
+ if isinstance(inst, ir.assign_types):
1747
1759
  name = inst.target.name
1748
1760
  definition = definitions.get(name, [])
1749
1761
  if definition == []:
@@ -1771,13 +1783,13 @@ def find_callname(
1771
1783
  """
1772
1784
  from numba.cuda.extending import _Intrinsic
1773
1785
 
1774
- require(isinstance(expr, ir.Expr) and expr.op == "call")
1786
+ require(isinstance(expr, ir.expr_types) and expr.op == "call")
1775
1787
  callee = expr.func
1776
1788
  callee_def = definition_finder(func_ir, callee)
1777
1789
  attrs = []
1778
1790
  obj = None
1779
1791
  while True:
1780
- if isinstance(callee_def, (ir.Global, ir.FreeVar)):
1792
+ if isinstance(callee_def, ir.global_types + ir.freevar_types):
1781
1793
  # require(callee_def.value == numpy)
1782
1794
  # these checks support modules like numpy, numpy.random as well as
1783
1795
  # calls like len() and intrinsics like assertEquiv
@@ -1829,7 +1841,9 @@ def find_callname(
1829
1841
  if class_name != "module":
1830
1842
  attrs.append(class_name)
1831
1843
  break
1832
- elif isinstance(callee_def, ir.Expr) and callee_def.op == "getattr":
1844
+ elif (
1845
+ isinstance(callee_def, ir.expr_types) and callee_def.op == "getattr"
1846
+ ):
1833
1847
  obj = callee_def.value
1834
1848
  attrs.append(callee_def.attr)
1835
1849
  if typemap and obj.name in typemap:
@@ -1851,9 +1865,9 @@ def find_build_sequence(func_ir, var):
1851
1865
  operator, or raise GuardException otherwise.
1852
1866
  Note: only build_tuple is immutable, so use with care.
1853
1867
  """
1854
- require(isinstance(var, ir.Var))
1868
+ require(isinstance(var, ir.var_types))
1855
1869
  var_def = get_definition(func_ir, var)
1856
- require(isinstance(var_def, ir.Expr))
1870
+ require(isinstance(var_def, ir.expr_types))
1857
1871
  build_ops = ["build_tuple", "build_list", "build_set"]
1858
1872
  require(var_def.op in build_ops)
1859
1873
  return var_def.items, var_def.op
@@ -1863,9 +1877,11 @@ def find_const(func_ir, var):
1863
1877
  """Check if a variable is defined as constant, and return
1864
1878
  the constant value, or raise GuardException otherwise.
1865
1879
  """
1866
- require(isinstance(var, ir.Var))
1880
+ require(isinstance(var, ir.var_types))
1867
1881
  var_def = get_definition(func_ir, var)
1868
- require(isinstance(var_def, (ir.Const, ir.Global, ir.FreeVar)))
1882
+ require(
1883
+ isinstance(var_def, ir.const_types + ir.global_types + ir.freevar_types)
1884
+ )
1869
1885
  return var_def.value
1870
1886
 
1871
1887
 
@@ -1908,7 +1924,7 @@ def compile_to_numba_ir(
1908
1924
  # rename all variables to avoid conflict
1909
1925
  var_table = get_name_var_table(f_ir.blocks)
1910
1926
  new_var_dict = {}
1911
- for name, var in var_table.items():
1927
+ for name in var_table.keys():
1912
1928
  new_var_dict[name] = mk_unique_var(name)
1913
1929
  replace_var_names(f_ir.blocks, new_var_dict)
1914
1930
 
@@ -2025,7 +2041,9 @@ def replace_arg_nodes(block, args):
2025
2041
  Replace ir.Arg(...) with variables
2026
2042
  """
2027
2043
  for stmt in block.body:
2028
- if isinstance(stmt, ir.Assign) and isinstance(stmt.value, ir.Arg):
2044
+ if isinstance(stmt, ir.assign_types) and isinstance(
2045
+ stmt.value, ir.arg_types
2046
+ ):
2029
2047
  idx = stmt.value.index
2030
2048
  assert idx < len(args)
2031
2049
  stmt.value = args[idx]
@@ -2041,12 +2059,12 @@ def replace_returns(blocks, target, return_label):
2041
2059
  if not block.body:
2042
2060
  continue
2043
2061
  stmt = block.terminator
2044
- if isinstance(stmt, ir.Return):
2062
+ if isinstance(stmt, ir.return_types):
2045
2063
  block.body.pop() # remove return
2046
2064
  cast_stmt = block.body.pop()
2047
2065
  assert (
2048
- isinstance(cast_stmt, ir.Assign)
2049
- and isinstance(cast_stmt.value, ir.Expr)
2066
+ isinstance(cast_stmt, ir.assign_types)
2067
+ and isinstance(cast_stmt.value, ir.expr_types)
2050
2068
  and cast_stmt.value.op == "cast"
2051
2069
  ), "invalid return cast"
2052
2070
  block.body.append(
@@ -2093,7 +2111,7 @@ def dump_blocks(blocks):
2093
2111
  def is_operator_or_getitem(expr):
2094
2112
  """true if expr is unary or binary operator or getitem"""
2095
2113
  return (
2096
- isinstance(expr, ir.Expr)
2114
+ isinstance(expr, ir.expr_types)
2097
2115
  and getattr(expr, "op", False)
2098
2116
  and expr.op
2099
2117
  in ["unary", "binop", "inplace_binop", "getitem", "static_getitem"]
@@ -2108,15 +2126,15 @@ def is_get_setitem(stmt):
2108
2126
  def is_getitem(stmt):
2109
2127
  """true if stmt is a getitem or static_getitem assignment"""
2110
2128
  return (
2111
- isinstance(stmt, ir.Assign)
2112
- and isinstance(stmt.value, ir.Expr)
2129
+ isinstance(stmt, ir.assign_types)
2130
+ and isinstance(stmt.value, ir.expr_types)
2113
2131
  and stmt.value.op in ["getitem", "static_getitem"]
2114
2132
  )
2115
2133
 
2116
2134
 
2117
2135
  def is_setitem(stmt):
2118
2136
  """true if stmt is a SetItem or StaticSetItem node"""
2119
- return isinstance(stmt, (ir.SetItem, ir.StaticSetItem))
2137
+ return isinstance(stmt, ir.setitem_types + ir.staticsetitem_types)
2120
2138
 
2121
2139
 
2122
2140
  def index_var_of_get_setitem(stmt):
@@ -2128,7 +2146,7 @@ def index_var_of_get_setitem(stmt):
2128
2146
  return stmt.value.index_var
2129
2147
 
2130
2148
  if is_setitem(stmt):
2131
- if isinstance(stmt, ir.SetItem):
2149
+ if isinstance(stmt, ir.setitem_types):
2132
2150
  return stmt.index
2133
2151
  else:
2134
2152
  return stmt.index_var
@@ -2143,7 +2161,7 @@ def set_index_var_of_get_setitem(stmt, new_index):
2143
2161
  else:
2144
2162
  stmt.value.index_var = new_index
2145
2163
  elif is_setitem(stmt):
2146
- if isinstance(stmt, ir.SetItem):
2164
+ if isinstance(stmt, ir.setitem_types):
2147
2165
  stmt.index = new_index
2148
2166
  else:
2149
2167
  stmt.index_var = new_index
@@ -2242,10 +2260,10 @@ def find_outer_value(func_ir, var):
2242
2260
  or raise GuardException otherwise.
2243
2261
  """
2244
2262
  dfn = get_definition(func_ir, var)
2245
- if isinstance(dfn, (ir.Global, ir.FreeVar)):
2263
+ if isinstance(dfn, ir.global_types + ir.freevar_types):
2246
2264
  return dfn.value
2247
2265
 
2248
- if isinstance(dfn, ir.Expr) and dfn.op == "getattr":
2266
+ if isinstance(dfn, ir.expr_types) and dfn.op == "getattr":
2249
2267
  prev_val = find_outer_value(func_ir, dfn.value)
2250
2268
  try:
2251
2269
  val = getattr(prev_val, dfn.attr)
@@ -2288,9 +2306,9 @@ def raise_on_unsupported_feature(func_ir, typemap):
2288
2306
  raise UnsupportedError(msg, func_ir.loc)
2289
2307
 
2290
2308
  for blk in func_ir.blocks.values():
2291
- for stmt in blk.find_insts(ir.Assign):
2309
+ for stmt in blk.find_insts(ir.assign_types):
2292
2310
  # This raises on finding `make_function`
2293
- if isinstance(stmt.value, ir.Expr):
2311
+ if isinstance(stmt.value, ir.expr_types):
2294
2312
  if stmt.value.op == "make_function":
2295
2313
  val = stmt.value
2296
2314
 
@@ -2321,7 +2339,7 @@ def raise_on_unsupported_feature(func_ir, typemap):
2321
2339
  raise UnsupportedError(msg, stmt.value.loc)
2322
2340
 
2323
2341
  # this checks for gdb initialization calls, only one is permitted
2324
- if isinstance(stmt.value, (ir.Global, ir.FreeVar)):
2342
+ if isinstance(stmt.value, ir.global_types + ir.freevar_types):
2325
2343
  val = stmt.value
2326
2344
  val = getattr(val, "value", None)
2327
2345
  if val is None:
@@ -2337,7 +2355,7 @@ def raise_on_unsupported_feature(func_ir, typemap):
2337
2355
  gdb_calls.append(stmt.loc) # report last seen location
2338
2356
 
2339
2357
  # this checks that np.<type> was called if view is called
2340
- if isinstance(stmt.value, ir.Expr):
2358
+ if isinstance(stmt.value, ir.expr_types):
2341
2359
  if stmt.value.op == "getattr" and stmt.value.attr == "view":
2342
2360
  var = stmt.value.value.name
2343
2361
  if isinstance(typemap[var], types.Array):
@@ -2363,7 +2381,7 @@ def raise_on_unsupported_feature(func_ir, typemap):
2363
2381
  )
2364
2382
 
2365
2383
  # checks for globals that are also reflected
2366
- if isinstance(stmt.value, ir.Global):
2384
+ if isinstance(stmt.value, ir.global_types):
2367
2385
  ty = typemap[stmt.target.name]
2368
2386
  msg = (
2369
2387
  "The use of a %s type, assigned to variable '%s' in "
@@ -2380,7 +2398,10 @@ def raise_on_unsupported_feature(func_ir, typemap):
2380
2398
 
2381
2399
  # checks for generator expressions (yield in use when func_ir has
2382
2400
  # not been identified as a generator).
2383
- if isinstance(stmt.value, ir.Yield) and not func_ir.is_generator:
2401
+ if (
2402
+ isinstance(stmt.value, ir.yield_types)
2403
+ and not func_ir.is_generator
2404
+ ):
2384
2405
  msg = "The use of generator expressions is unsupported."
2385
2406
  raise UnsupportedError(msg, loc=stmt.loc)
2386
2407
 
@@ -2443,7 +2464,7 @@ def resolve_func_from_module(func_ir, node):
2443
2464
  except KeyError: # multiple definitions
2444
2465
  return None
2445
2466
  return resolve_mod(mod)
2446
- elif isinstance(mod, (ir.Global, ir.FreeVar)):
2467
+ elif isinstance(mod, ir.global_types + ir.freevar_types):
2447
2468
  if isinstance(mod.value, pytypes.ModuleType):
2448
2469
  return mod
2449
2470
  return None
@@ -2466,7 +2487,7 @@ def enforce_no_dels(func_ir):
2466
2487
  Enforce there being no ir.Del nodes in the IR.
2467
2488
  """
2468
2489
  for blk in func_ir.blocks.values():
2469
- dels = [x for x in blk.find_insts(ir.Del)]
2490
+ dels = [x for x in blk.find_insts(ir.del_types)]
2470
2491
  if dels:
2471
2492
  msg = "Illegal IR, del found at: %s" % dels[0]
2472
2493
  raise CompilerError(msg, loc=dels[0].loc)
@@ -2522,7 +2543,7 @@ def convert_code_obj_to_function(code_obj, caller_ir):
2522
2543
  "are multiple definitions present." % x
2523
2544
  )
2524
2545
  raise TypingError(msg, loc=code_obj.loc)
2525
- if isinstance(freevar_def, ir.Const):
2546
+ if isinstance(freevar_def, ir.const_types):
2526
2547
  freevars.append(freevar_def.value)
2527
2548
  else:
2528
2549
  msg = (
@@ -2619,20 +2640,20 @@ def transfer_scope(block, scope):
2619
2640
 
2620
2641
 
2621
2642
  def is_setup_with(stmt):
2622
- return isinstance(stmt, ir.EnterWith)
2643
+ return isinstance(stmt, ir.enterwith_types)
2623
2644
 
2624
2645
 
2625
2646
  def is_terminator(stmt):
2626
- return isinstance(stmt, ir.Terminator)
2647
+ return isinstance(stmt, ir.terminator_types)
2627
2648
 
2628
2649
 
2629
2650
  def is_raise(stmt):
2630
- return isinstance(stmt, ir.Raise)
2651
+ return isinstance(stmt, ir.raise_types)
2631
2652
 
2632
2653
 
2633
2654
  def is_return(stmt):
2634
- return isinstance(stmt, ir.Return)
2655
+ return isinstance(stmt, ir.return_types)
2635
2656
 
2636
2657
 
2637
2658
  def is_pop_block(stmt):
2638
- return isinstance(stmt, ir.PopBlock)
2659
+ return isinstance(stmt, ir.popblock_types)