Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lowering error in certain conditions #7389

Open
2 tasks done
auderson opened this issue Sep 9, 2021 · 1 comment
Open
2 tasks done

lowering error in certain conditions #7389

auderson opened this issue Sep 9, 2021 · 1 comment
Labels
bug - failure to compile Bugs: failed to compile valid code ParallelAccelerator

Comments

@auderson
Copy link

auderson commented Sep 9, 2021

Reporting a bug

  • I have tried using the latest released version of Numba (most recent is
    visible in the change log (https://github.com/numba/numba/blob/master/CHANGE_LOG).
  • I have included a self contained code sample to reproduce the problem.
    i.e. it's possible to run as 'python bug.py'.

Hi,
I wonder if this is a bug:

@njit(nogil=True)
def inner_open(arr, kind='mergesort'):
    if kind == 'mergesort':
        return np.argsort(arr, kind='mergesort')
    if kind == 'quicksort':
        return np.argsort(arr, kind='quicksort')


@njit(nogil=True)
def inner_closed(arr, kind='mergesort'):
    if kind == 'mergesort':
        return np.argsort(arr, kind='mergesort')
    else:
        return np.argsort(arr, kind='quicksort')

the difference of these 2 inner functions is the way of using if-else, the first one is not closed.

no errors

@njit(parallel=True)
def outer_close_div(matrix):
    result = matrix.copy()
    for i, mat in enumerate(matrix):
        result[i] = inner_closed(mat) / (i + 1)
    return result

outer_close_div(np.random.randn(10, 10))
@njit(parallel=True)
def outer_open(matrix):
    result = matrix.copy()
    for i, mat in enumerate(matrix):
        result[i] = inner_open(mat)
    return result

outer_open(np.random.randn(10, 10))

error:

It's strange that inner_open can be used alone but can't be used with other operations including itself:

@njit(parallel=True)
def outer_open_div(matrix):
    result = matrix.copy()
    for i, mat in enumerate(matrix):
        result[i] = inner_open(mat) / (i + 1)
    return result

outer_open_div(np.random.randn(10, 10))

@njit(parallel=True)
def outer_open_open(matrix):
    result = matrix.copy()
    for i, mat in enumerate(matrix):
        result[i] = inner_open(mat) + inner_open(mat)
    return result

outer_open_open(np.random.randn(10, 10))
Traceback (most recent call last):
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/errors.py", line 776, in new_error_context
    yield
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 235, in lower_block
    self.lower_inst(inst)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 497, in lower_inst
    func(self, inst)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/parfors/parfor_lowering.py", line 90, in _lower_parfor_parallel
    lowerer.lower_inst(instr)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 380, in lower_inst
    val = self.lower_assign(ty, inst)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 556, in lower_assign
    return self.lower_expr(ty, value)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 1084, in lower_expr
    res = self.lower_call(resty, expr)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 815, in lower_call
    res = self._lower_call_normal(fnty, expr, signature)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 1037, in _lower_call_normal
    argvals = self.fold_call_args(
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 754, in fold_call_args
    argvals = typing.fold_arguments(pysig,
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/typing/templates.py", line 243, in fold_arguments
    ba.arguments[name] = normal_handler(i, param, ba.arguments[name])
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 741, in normal_handler
    return self._cast_var(var, signature.args[index])
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 719, in _cast_var
    val = self.loadvar(var.name)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 1327, in loadvar
    ptr = self.getvar(name)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 1319, in getvar
    return self.varmap[name]
KeyError: '$38binary_true_divide.11_size0.6936'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/IPython/core/interactiveshell.py", line 3441, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-49-66d3935fd7b7>", line 8, in <module>
    outer_open_div(np.random.randn(10, 10))
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/dispatcher.py", line 501, in _compile_for_args
    raise e
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/dispatcher.py", line 434, in _compile_for_args
    return_val = self.compile(tuple(argtypes))
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/dispatcher.py", line 979, in compile
    cres = self._compiler.compile(args, return_type)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/dispatcher.py", line 141, in compile
    status, retval = self._compile_cached(args, return_type)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/dispatcher.py", line 155, in _compile_cached
    retval = self._compile_core(args, return_type)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/dispatcher.py", line 168, in _compile_core
    cres = compiler.compile_extra(self.targetdescr.typing_context,
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/compiler.py", line 686, in compile_extra
    return pipeline.compile_extra(func)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/compiler.py", line 428, in compile_extra
    return self._compile_bytecode()
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/compiler.py", line 492, in _compile_bytecode
    return self._compile_core()
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/compiler.py", line 471, in _compile_core
    raise e
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/compiler.py", line 462, in _compile_core
    pm.run(self.state)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/compiler_machinery.py", line 343, in run
    raise patched_exception
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/compiler_machinery.py", line 334, in run
    self._runPass(idx, pass_inst, state)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/compiler_lock.py", line 35, in _acquire_compile_lock
    return func(*args, **kwargs)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/compiler_machinery.py", line 289, in _runPass
    mutated |= check(pss.run_pass, internal_state)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/compiler_machinery.py", line 262, in check
    mangled = func(compiler_state)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/typed_passes.py", line 396, in run_pass
    lower.lower()
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 138, in lower
    self.lower_normal_function(self.fndesc)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 192, in lower_normal_function
    entry_block_tail = self.lower_function_body()
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 221, in lower_function_body
    self.lower_block(block)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/lowering.py", line 235, in lower_block
    self.lower_inst(inst)
  File "/home/auderson/miniconda3/lib/python3.8/contextlib.py", line 131, in __exit__
    self.gen.throw(type, value, traceback)
  File "/home/auderson/miniconda3/lib/python3.8/site-packages/numba/core/errors.py", line 786, in new_error_context
    raise newerr.with_traceback(tb)
numba.core.errors.LoweringError: Failed in nopython mode pipeline (step: native lowering)
'$38binary_true_divide.11_size0.6936'
File "<ipython-input-49-66d3935fd7b7>", line 5:
def outer_open_div(matrix):
    <source elided>
    for i, mat in enumerate(matrix):
        result[i] = inner_open(mat) / (i + 1)
        ^
During: lowering "id=60[LoopNest(index_variable = parfor_index.6937, range = (0, $38binary_true_divide.11_size0.6936, 1))]{2596: <ir.Block at <ipython-input-49-66d3935fd7b7> (5)>}Var(parfor_index.6937, <ipython-input-49-66d3935fd7b7>:5)" at <ipython-input-49-66d3935fd7b7> (5)
@stuartarchibald
Copy link
Contributor

Thanks for the report, I can reproduce. I think the issue is because the inner_open function could return None.
MWR:

from numba import njit
import numpy as np

@njit
def bar(arr, predicate=True):
    if predicate:
        return np.ones(5)

@njit(parallel=True)
def foo(x):
    bar(x) / 1

foo(np.ones(1,))

This "fixes" the original problem by making the case where None is returned unreachable:

from numba import njit
import numpy as np

@njit
def bar(arr, kind='mergesort'):
    if kind == 'mergesort':
        return np.argsort(arr, kind='mergesort')
    if kind == 'quicksort':
        return np.argsort(arr, kind='quicksort')
    assert 0

@njit(parallel=True)
def foo(x):
    bar(x) / 1

foo(np.ones(1,))

CC @DrTodd13 think this is a parfors issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug - failure to compile Bugs: failed to compile valid code ParallelAccelerator
Projects
None yet
Development

No branches or pull requests

2 participants