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.
- numba_cuda/VERSION +1 -1
- numba_cuda/numba/cuda/__init__.py +4 -1
- numba_cuda/numba/cuda/_compat.py +47 -0
- 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 +8 -40
- numba_cuda/numba/cuda/cext/_hashtable.cpp +5 -0
- numba_cuda/numba/cuda/cext/_helperlib.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/cext/_pymodule.h +1 -1
- numba_cuda/numba/cuda/cext/_typeconv.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/cext/_typeof.cpp +56 -119
- numba_cuda/numba/cuda/cext/mviewbuf.c +7 -1
- numba_cuda/numba/cuda/cext/mviewbuf.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +4 -5
- numba_cuda/numba/cuda/codegen.py +46 -12
- numba_cuda/numba/cuda/compiler.py +15 -9
- numba_cuda/numba/cuda/core/analysis.py +29 -21
- numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +1 -1
- numba_cuda/numba/cuda/core/annotations/type_annotations.py +4 -4
- numba_cuda/numba/cuda/core/base.py +12 -11
- numba_cuda/numba/cuda/core/bytecode.py +21 -13
- numba_cuda/numba/cuda/core/byteflow.py +336 -90
- numba_cuda/numba/cuda/core/compiler.py +3 -4
- numba_cuda/numba/cuda/core/compiler_machinery.py +3 -3
- numba_cuda/numba/cuda/core/config.py +5 -7
- numba_cuda/numba/cuda/core/consts.py +1 -1
- numba_cuda/numba/cuda/core/controlflow.py +17 -9
- 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 +82 -67
- numba_cuda/numba/cuda/core/interpreter.py +334 -160
- numba_cuda/numba/cuda/core/ir.py +191 -119
- numba_cuda/numba/cuda/core/ir_utils.py +149 -128
- numba_cuda/numba/cuda/core/postproc.py +8 -8
- numba_cuda/numba/cuda/core/pythonapi.py +3 -0
- numba_cuda/numba/cuda/core/rewrites/ir_print.py +6 -3
- numba_cuda/numba/cuda/core/rewrites/static_binop.py +1 -1
- 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 +5 -5
- numba_cuda/numba/cuda/core/transforms.py +29 -16
- numba_cuda/numba/cuda/core/typed_passes.py +10 -10
- numba_cuda/numba/cuda/core/typeinfer.py +42 -27
- numba_cuda/numba/cuda/core/untyped_passes.py +82 -65
- numba_cuda/numba/cuda/cpython/unicode.py +2 -2
- numba_cuda/numba/cuda/cpython/unicode_support.py +1 -3
- numba_cuda/numba/cuda/cudadecl.py +0 -13
- numba_cuda/numba/cuda/cudadrv/devicearray.py +10 -9
- numba_cuda/numba/cuda/cudadrv/driver.py +142 -519
- numba_cuda/numba/cuda/cudadrv/dummyarray.py +4 -0
- numba_cuda/numba/cuda/cudadrv/nvrtc.py +87 -32
- numba_cuda/numba/cuda/cudaimpl.py +0 -12
- numba_cuda/numba/cuda/debuginfo.py +25 -0
- numba_cuda/numba/cuda/descriptor.py +1 -1
- numba_cuda/numba/cuda/device_init.py +4 -7
- numba_cuda/numba/cuda/deviceufunc.py +3 -6
- numba_cuda/numba/cuda/dispatcher.py +39 -49
- numba_cuda/numba/cuda/intrinsics.py +150 -1
- numba_cuda/numba/cuda/libdeviceimpl.py +1 -2
- numba_cuda/numba/cuda/lowering.py +36 -29
- numba_cuda/numba/cuda/memory_management/nrt.py +10 -14
- numba_cuda/numba/cuda/np/arrayobj.py +61 -9
- numba_cuda/numba/cuda/np/numpy_support.py +32 -9
- numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +4 -3
- 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/testing.py +4 -8
- 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 +195 -51
- 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_events.py +1 -1
- numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +6 -7
- numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +11 -12
- numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +53 -23
- numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +61 -9
- numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +6 -0
- numba_cuda/numba/cuda/tests/cudapy/test_caching.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +22 -1
- numba_cuda/numba/cuda/tests/cudapy/test_complex.py +13 -0
- numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +1 -1
- numba_cuda/numba/cuda/tests/cudapy/test_debug.py +1 -1
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +94 -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_extending.py +1 -1
- 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_vector_type.py +37 -35
- numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +117 -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/tests/support.py +11 -0
- numba_cuda/numba/cuda/types/cuda_functions.py +1 -1
- numba_cuda/numba/cuda/typing/asnumbatype.py +37 -2
- numba_cuda/numba/cuda/typing/context.py +3 -1
- numba_cuda/numba/cuda/typing/typeof.py +51 -2
- {numba_cuda-0.21.1.dist-info → numba_cuda-0.24.0.dist-info}/METADATA +4 -13
- {numba_cuda-0.21.1.dist-info → numba_cuda-0.24.0.dist-info}/RECORD +106 -105
- 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.24.0.dist-info}/WHEEL +0 -0
- {numba_cuda-0.21.1.dist-info → numba_cuda-0.24.0.dist-info}/licenses/LICENSE +0 -0
- {numba_cuda-0.21.1.dist-info → numba_cuda-0.24.0.dist-info}/licenses/LICENSE.numba +0 -0
- {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.
|
|
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)
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
451
|
+
elif isinstance(stmt, ir.arg_types):
|
|
458
452
|
stmt.name = visit_vars_inner(stmt.name, callback, cbdata)
|
|
459
|
-
elif isinstance(stmt, ir.
|
|
453
|
+
elif isinstance(stmt, ir.return_types):
|
|
460
454
|
stmt.value = visit_vars_inner(stmt.value, callback, cbdata)
|
|
461
|
-
elif isinstance(stmt, ir.
|
|
455
|
+
elif isinstance(stmt, ir.raise_types):
|
|
462
456
|
stmt.exception = visit_vars_inner(stmt.exception, callback, cbdata)
|
|
463
|
-
elif isinstance(stmt, ir.
|
|
457
|
+
elif isinstance(stmt, ir.branch_types):
|
|
464
458
|
stmt.cond = visit_vars_inner(stmt.cond, callback, cbdata)
|
|
465
|
-
elif isinstance(stmt, ir.
|
|
459
|
+
elif isinstance(stmt, ir.jump_types):
|
|
466
460
|
stmt.target = visit_vars_inner(stmt.target, callback, cbdata)
|
|
467
|
-
elif isinstance(stmt, ir.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
528
|
+
if isinstance(term, ir.jump_types):
|
|
535
529
|
b.body[-1] = ir.Jump(term.target + offset, term.loc)
|
|
536
|
-
if isinstance(term, ir.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
595
|
-
|
|
596
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
842
|
+
if isinstance(rhs, ir.yield_types):
|
|
849
843
|
return False
|
|
850
|
-
if isinstance(rhs, ir.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
1127
|
+
if isinstance(stmt, ir.assign_types):
|
|
1129
1128
|
lhs = stmt.target.name
|
|
1130
|
-
if isinstance(stmt.value, ir.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1231
|
-
stmt.value, ir.
|
|
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,
|
|
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.
|
|
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.
|
|
1355
|
+
if isinstance(inst, ir.assign_types):
|
|
1355
1356
|
lhs = inst.target.name
|
|
1356
1357
|
rhs = inst.value
|
|
1357
|
-
if isinstance(rhs, ir.
|
|
1358
|
+
if isinstance(rhs, ir.expr_types) and rhs.op == "call":
|
|
1358
1359
|
call_table[rhs.func.name] = []
|
|
1359
|
-
if isinstance(rhs, ir.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1405
|
+
if isinstance(inst, ir.assign_types):
|
|
1405
1406
|
lhs = inst.target.name
|
|
1406
1407
|
rhs = inst.value
|
|
1407
|
-
if isinstance(rhs, ir.
|
|
1408
|
+
if isinstance(rhs, ir.expr_types) and rhs.op == "build_tuple":
|
|
1408
1409
|
tuple_table[lhs] = rhs.items
|
|
1409
|
-
if isinstance(rhs, ir.
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
1594
|
+
if isinstance(inst, ir.setitem_types):
|
|
1586
1595
|
accesses.add((inst.target.name, inst.index.name))
|
|
1587
|
-
if isinstance(inst, ir.
|
|
1596
|
+
if isinstance(inst, ir.staticsetitem_types):
|
|
1588
1597
|
accesses.add((inst.target.name, inst.index_var.name))
|
|
1589
|
-
if isinstance(inst, ir.
|
|
1598
|
+
if isinstance(inst, ir.assign_types):
|
|
1590
1599
|
rhs = inst.value
|
|
1591
|
-
if isinstance(rhs, ir.
|
|
1600
|
+
if isinstance(rhs, ir.expr_types) and rhs.op == "getitem":
|
|
1592
1601
|
accesses.add((rhs.value.name, rhs.index.name))
|
|
1593
|
-
if
|
|
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.
|
|
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.
|
|
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,
|
|
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
|
|
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.
|
|
1868
|
+
require(isinstance(var, ir.var_types))
|
|
1855
1869
|
var_def = get_definition(func_ir, var)
|
|
1856
|
-
require(isinstance(var_def, ir.
|
|
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.
|
|
1880
|
+
require(isinstance(var, ir.var_types))
|
|
1867
1881
|
var_def = get_definition(func_ir, var)
|
|
1868
|
-
require(
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
2049
|
-
and isinstance(cast_stmt.value, ir.
|
|
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.
|
|
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.
|
|
2112
|
-
and isinstance(stmt.value, ir.
|
|
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,
|
|
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.
|
|
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.
|
|
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,
|
|
2263
|
+
if isinstance(dfn, ir.global_types + ir.freevar_types):
|
|
2246
2264
|
return dfn.value
|
|
2247
2265
|
|
|
2248
|
-
if isinstance(dfn, ir.
|
|
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.
|
|
2309
|
+
for stmt in blk.find_insts(ir.assign_types):
|
|
2292
2310
|
# This raises on finding `make_function`
|
|
2293
|
-
if isinstance(stmt.value, ir.
|
|
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,
|
|
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.
|
|
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.
|
|
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
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
2643
|
+
return isinstance(stmt, ir.enterwith_types)
|
|
2623
2644
|
|
|
2624
2645
|
|
|
2625
2646
|
def is_terminator(stmt):
|
|
2626
|
-
return isinstance(stmt, ir.
|
|
2647
|
+
return isinstance(stmt, ir.terminator_types)
|
|
2627
2648
|
|
|
2628
2649
|
|
|
2629
2650
|
def is_raise(stmt):
|
|
2630
|
-
return isinstance(stmt, ir.
|
|
2651
|
+
return isinstance(stmt, ir.raise_types)
|
|
2631
2652
|
|
|
2632
2653
|
|
|
2633
2654
|
def is_return(stmt):
|
|
2634
|
-
return isinstance(stmt, ir.
|
|
2655
|
+
return isinstance(stmt, ir.return_types)
|
|
2635
2656
|
|
|
2636
2657
|
|
|
2637
2658
|
def is_pop_block(stmt):
|
|
2638
|
-
return isinstance(stmt, ir.
|
|
2659
|
+
return isinstance(stmt, ir.popblock_types)
|