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.
- numba_cuda/VERSION +1 -1
- numba_cuda/numba/cuda/api.py +4 -1
- numba_cuda/numba/cuda/cext/_dispatcher.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cpp +0 -38
- numba_cuda/numba/cuda/cext/_helperlib.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/cext/_typeconv.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/cext/_typeof.cpp +0 -111
- numba_cuda/numba/cuda/cext/mviewbuf.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/codegen.py +42 -10
- numba_cuda/numba/cuda/compiler.py +10 -4
- numba_cuda/numba/cuda/core/analysis.py +29 -21
- numba_cuda/numba/cuda/core/annotations/type_annotations.py +4 -4
- numba_cuda/numba/cuda/core/base.py +6 -1
- numba_cuda/numba/cuda/core/consts.py +1 -1
- numba_cuda/numba/cuda/core/cuda_errors.py +917 -0
- numba_cuda/numba/cuda/core/errors.py +4 -912
- numba_cuda/numba/cuda/core/inline_closurecall.py +71 -57
- numba_cuda/numba/cuda/core/interpreter.py +79 -64
- numba_cuda/numba/cuda/core/ir.py +191 -119
- numba_cuda/numba/cuda/core/ir_utils.py +142 -112
- numba_cuda/numba/cuda/core/postproc.py +8 -8
- numba_cuda/numba/cuda/core/rewrites/ir_print.py +6 -3
- numba_cuda/numba/cuda/core/rewrites/static_getitem.py +5 -5
- numba_cuda/numba/cuda/core/rewrites/static_raise.py +3 -3
- numba_cuda/numba/cuda/core/ssa.py +3 -3
- numba_cuda/numba/cuda/core/transforms.py +25 -10
- numba_cuda/numba/cuda/core/typed_passes.py +9 -9
- numba_cuda/numba/cuda/core/typeinfer.py +39 -24
- numba_cuda/numba/cuda/core/untyped_passes.py +71 -55
- numba_cuda/numba/cuda/cudadecl.py +0 -13
- numba_cuda/numba/cuda/cudadrv/devicearray.py +6 -5
- numba_cuda/numba/cuda/cudadrv/driver.py +132 -511
- numba_cuda/numba/cuda/cudadrv/dummyarray.py +4 -0
- numba_cuda/numba/cuda/cudadrv/nvrtc.py +16 -0
- numba_cuda/numba/cuda/cudaimpl.py +0 -12
- numba_cuda/numba/cuda/debuginfo.py +104 -10
- numba_cuda/numba/cuda/descriptor.py +1 -1
- numba_cuda/numba/cuda/device_init.py +4 -7
- numba_cuda/numba/cuda/dispatcher.py +36 -32
- numba_cuda/numba/cuda/intrinsics.py +150 -1
- numba_cuda/numba/cuda/lowering.py +64 -29
- numba_cuda/numba/cuda/memory_management/nrt.py +10 -14
- numba_cuda/numba/cuda/np/arrayobj.py +54 -0
- numba_cuda/numba/cuda/np/numpy_support.py +26 -0
- numba_cuda/numba/cuda/printimpl.py +20 -0
- numba_cuda/numba/cuda/serialize.py +10 -0
- numba_cuda/numba/cuda/stubs.py +0 -11
- numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +21 -4
- numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +1 -2
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +130 -48
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +6 -2
- numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +3 -1
- numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +5 -6
- numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +11 -12
- numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +27 -19
- numba_cuda/numba/cuda/tests/cudapy/test_caching.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +10 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +89 -0
- numba_cuda/numba/cuda/tests/cudapy/test_device_array_capture.py +243 -0
- numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +3 -3
- numba_cuda/numba/cuda/tests/cudapy/test_numba_interop.py +35 -0
- numba_cuda/numba/cuda/tests/cudapy/test_print.py +51 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +116 -1
- numba_cuda/numba/cuda/tests/doc_examples/test_globals.py +111 -0
- numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +61 -0
- numba_cuda/numba/cuda/tests/nrt/test_nrt.py +31 -0
- numba_cuda/numba/cuda/typing/context.py +3 -1
- numba_cuda/numba/cuda/typing/typeof.py +56 -0
- {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/METADATA +1 -1
- {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/RECORD +74 -74
- numba_cuda/numba/cuda/cext/_devicearray.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/cext/_devicearray.cpp +0 -159
- numba_cuda/numba/cuda/cext/_devicearray.h +0 -29
- numba_cuda/numba/cuda/intrinsic_wrapper.py +0 -41
- {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/WHEEL +0 -0
- {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/licenses/LICENSE +0 -0
- {numba_cuda-0.21.1.dist-info → numba_cuda-0.23.0.dist-info}/licenses/LICENSE.numba +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
457
|
+
elif isinstance(stmt, ir.arg_types):
|
|
458
458
|
stmt.name = visit_vars_inner(stmt.name, callback, cbdata)
|
|
459
|
-
elif isinstance(stmt, ir.
|
|
459
|
+
elif isinstance(stmt, ir.return_types):
|
|
460
460
|
stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
|
|
461
|
-
elif isinstance(stmt, ir.
|
|
461
|
+
elif isinstance(stmt, ir.raise_types):
|
|
462
462
|
stmt.exception = visit_vars_inner(stmt.exception, callback, cbdata)
|
|
463
|
-
elif isinstance(stmt, ir.
|
|
463
|
+
elif isinstance(stmt, ir.branch_types):
|
|
464
464
|
stmt.cond = visit_vars_inner(stmt.cond, callback, cbdata)
|
|
465
|
-
elif isinstance(stmt, ir.
|
|
465
|
+
elif isinstance(stmt, ir.jump_types):
|
|
466
466
|
stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
|
|
467
|
-
elif isinstance(stmt, ir.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
534
|
+
if isinstance(term, ir.jump_types):
|
|
535
535
|
b.body[-1] = ir.Jump(term.target + offset, term.loc)
|
|
536
|
-
if isinstance(term, ir.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
850
|
+
if isinstance(rhs, ir.yield_types):
|
|
849
851
|
return False
|
|
850
|
-
if isinstance(rhs, ir.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
1136
|
+
if isinstance(stmt, ir.assign_types):
|
|
1129
1137
|
lhs = stmt.target.name
|
|
1130
|
-
if isinstance(stmt.value, ir.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1231
|
-
stmt.value, ir.
|
|
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,
|
|
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.
|
|
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.
|
|
1364
|
+
if isinstance(inst, ir.assign_types):
|
|
1355
1365
|
lhs = inst.target.name
|
|
1356
1366
|
rhs = inst.value
|
|
1357
|
-
if isinstance(rhs, ir.
|
|
1367
|
+
if isinstance(rhs, ir.expr_types) and rhs.op == "call":
|
|
1358
1368
|
call_table[rhs.func.name] = []
|
|
1359
|
-
if isinstance(rhs, ir.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1414
|
+
if isinstance(inst, ir.assign_types):
|
|
1405
1415
|
lhs = inst.target.name
|
|
1406
1416
|
rhs = inst.value
|
|
1407
|
-
if isinstance(rhs, ir.
|
|
1417
|
+
if isinstance(rhs, ir.expr_types) and rhs.op == "build_tuple":
|
|
1408
1418
|
tuple_table[lhs] = rhs.items
|
|
1409
|
-
if isinstance(rhs, ir.
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
1603
|
+
if isinstance(inst, ir.setitem_types):
|
|
1586
1604
|
accesses.add((inst.target.name, inst.index.name))
|
|
1587
|
-
if isinstance(inst, ir.
|
|
1605
|
+
if isinstance(inst, ir.staticsetitem_types):
|
|
1588
1606
|
accesses.add((inst.target.name, inst.index_var.name))
|
|
1589
|
-
if isinstance(inst, ir.
|
|
1607
|
+
if isinstance(inst, ir.assign_types):
|
|
1590
1608
|
rhs = inst.value
|
|
1591
|
-
if isinstance(rhs, ir.
|
|
1609
|
+
if isinstance(rhs, ir.expr_types) and rhs.op == "getitem":
|
|
1592
1610
|
accesses.add((rhs.value.name, rhs.index.name))
|
|
1593
|
-
if
|
|
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.
|
|
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.
|
|
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,
|
|
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
|
|
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.
|
|
1877
|
+
require(isinstance(var, ir.var_types))
|
|
1855
1878
|
var_def = get_definition(func_ir, var)
|
|
1856
|
-
require(isinstance(var_def, ir.
|
|
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.
|
|
1889
|
+
require(isinstance(var, ir.var_types))
|
|
1867
1890
|
var_def = get_definition(func_ir, var)
|
|
1868
|
-
require(
|
|
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.
|
|
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.
|
|
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.
|
|
2049
|
-
and isinstance(cast_stmt.value, ir.
|
|
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.
|
|
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.
|
|
2112
|
-
and isinstance(stmt.value, ir.
|
|
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,
|
|
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.
|
|
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.
|
|
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,
|
|
2272
|
+
if isinstance(dfn, ir.global_types + ir.freevar_types):
|
|
2246
2273
|
return dfn.value
|
|
2247
2274
|
|
|
2248
|
-
if isinstance(dfn, ir.
|
|
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.
|
|
2318
|
+
for stmt in blk.find_insts(ir.assign_types):
|
|
2292
2319
|
# This raises on finding `make_function`
|
|
2293
|
-
if isinstance(stmt.value, ir.
|
|
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,
|
|
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.
|
|
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.
|
|
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
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
2652
|
+
return isinstance(stmt, ir.enterwith_types)
|
|
2623
2653
|
|
|
2624
2654
|
|
|
2625
2655
|
def is_terminator(stmt):
|
|
2626
|
-
return isinstance(stmt, ir.
|
|
2656
|
+
return isinstance(stmt, ir.terminator_types)
|
|
2627
2657
|
|
|
2628
2658
|
|
|
2629
2659
|
def is_raise(stmt):
|
|
2630
|
-
return isinstance(stmt, ir.
|
|
2660
|
+
return isinstance(stmt, ir.raise_types)
|
|
2631
2661
|
|
|
2632
2662
|
|
|
2633
2663
|
def is_return(stmt):
|
|
2634
|
-
return isinstance(stmt, ir.
|
|
2664
|
+
return isinstance(stmt, ir.return_types)
|
|
2635
2665
|
|
|
2636
2666
|
|
|
2637
2667
|
def is_pop_block(stmt):
|
|
2638
|
-
return isinstance(stmt, ir.
|
|
2668
|
+
return isinstance(stmt, ir.popblock_types)
|