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

AssertionError when trying to set an array shape/strides #2224

Closed
ogauthe opened this issue Jul 16, 2024 · 5 comments · Fixed by #2238
Closed

AssertionError when trying to set an array shape/strides #2224

ogauthe opened this issue Jul 16, 2024 · 5 comments · Fixed by #2238

Comments

@ogauthe
Copy link

ogauthe commented Jul 16, 2024

Hi!

When trying to manually set an array shape, pythran triggers an AssertionError.

# pythran export set_shape(float64[:, :] order(C), (int64, int64, int64))
def set_shape(arr, sh):
    arr.shape = sh
    return arr
Traceback (most recent call last):
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/bin/pythran", line 8, in <module>
    sys.exit(run())
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/run.py", line 181, in run
    pythran.compile_pythranfile(args.input_file,
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/toolchain.py", line 501, in compile_pythranfile
    output_file = compile_pythrancode(module_name, fd.read(),
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/toolchain.py", line 402, in compile_pythrancode
    module, error_checker = generate_cxx(module_name, pythrancode, specs, opts,
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/toolchain.py", line 146, in generate_cxx
    pm, ir, docstrings = front_middle_end(module_name, code, optimizations,
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/toolchain.py", line 113, in front_middle_end
    refine(pm, ir, optimizations, report_times)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/middlend.py", line 31, in refine
    pm.apply(NormalizeMethodCalls, node, run_times)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/passmanager.py", line 243, in apply
    ret=a.apply(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/passmanager.py", line 200, in apply
    new_node = self.run(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/passmanager.py", line 189, in run
    n = super(Transformation, self).run(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/passmanager.py", line 97, in run
    return self.visit(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/passmanager.py", line 79, in visit
    return super(ContextManager, self).visit(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/ast.py", line 418, in visit
    return visitor(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/transformations/normalize_method_calls.py", line 50, in visit_Module
    self.generic_visit(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/ast.py", line 494, in generic_visit
    value = self.visit(value)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/passmanager.py", line 79, in visit
    return super(ContextManager, self).visit(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/ast.py", line 418, in visit
    return visitor(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/transformations/normalize_method_calls.py", line 65, in visit_FunctionDef
    self.generic_visit(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/ast.py", line 494, in generic_visit
    value = self.visit(value)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/passmanager.py", line 79, in visit
    return super(ContextManager, self).visit(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/ast.py", line 418, in visit
    return visitor(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/transformations/normalize_method_calls.py", line 85, in visit_Assign
    n = self.generic_visit(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/ast.py", line 494, in generic_visit
    value = self.visit(value)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/passmanager.py", line 79, in visit
    return super(ContextManager, self).visit(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/ast.py", line 418, in visit
    return visitor(node)
  File "/mnt/sw/nix/store/71ksmx7k6xy3v9ksfkv5mp5kxxp64pd6-python-3.10.13-view/lib/python3.10/site-packages/pythran/transformations/normalize_method_calls.py", line 201, in visit_Attribute
    assert node.attr in ('real', 'imag'), "only store to imag/real"
AssertionError: only store to imag/real

If I understand correctly the code of visit_Attribute, pythran fails to detect I want a setattr and not a getattr. This may be unsupported, but then the error message should mention it. The same errors arises when trying to set strides instead of shape.

Context: I want to implement

def slice_reshape_transpose(old_mat, r1, r2, c1, c2, old_tensor_shape, perm):
    return old_mat[r1:r2, c1:c2].reshape(old_tensor_shape).transpose(perm)

However currently pythran copies the data, which I want to avoid. I am trying to use a lower level approach and to replicate np.lib.stride_tricks.as_strided by manually setting shape and strides.

@serge-sans-paille
Copy link
Owner

I can only confirm that it's not officially supported. But it looks like something worth investigating for shapes... but for strides I don't think this will. I'll first give a try to supporting your original attempt.

@serge-sans-paille
Copy link
Owner

btw, there's no actual computation in your slice_reshape_transpose code... even if I were to succeed implementing this without copy, I don't see where pythran would give you any significant speedup

@ogauthe
Copy link
Author

ogauthe commented Sep 23, 2024

Thank you for the fix.

btw, there's no actual computation in your slice_reshape_transpose code... even if I were to succeed implementing this without copy, I don't see where pythran would give you any significant speedup

The aim was to speed-up a larger loop that includes this operation. I found another solution.

@serge-sans-paille
Copy link
Owner

If that makes sense, I'd be curious to read the final kernel

@ogauthe
Copy link
Author

ogauthe commented Sep 23, 2024

So my current solution is to use numba (sorry...) I have a python function

@numba.njit
def numba_transpose_reshape(old_mat, r1, r2, c1, c2, old_nrr, old_tensor_shape, perm):
    """
    numba version of
    old_mat[r1:r2, c1:c2].reshape(old_tensor_shape).transpose(perm)
    """
    NDIM = len(perm)

    old_tensor_strides = numba_compute_tensor_strides(
        old_mat.strides, old_nrr, old_tensor_shape
    )
    new_tensor_shape = np.empty((NDIM,), dtype=np.int64)
    new_tensor_strides = np.empty((NDIM,), dtype=np.int64)
    for i in range(NDIM):
        new_tensor_shape[i] = old_tensor_shape[perm[i]]
        new_tensor_strides[i] = old_tensor_strides[perm[i]]

    sht = numba.np.unsafe.ndarray.to_fixed_tuple(new_tensor_shape, NDIM)
    stridest = numba.np.unsafe.ndarray.to_fixed_tuple(new_tensor_strides, NDIM)
    permuted = np.lib.stride_tricks.as_strided(
        old_mat[r1:r2, c1:c2], shape=sht, strides=stridest
    )
    return permuted

When I compile for e.g. a 6-dim tensor, I have signature

In [7]: numba_transpose_reshape.signatures[0]
Out[7]: 
(Array(float64, 2, 'C', True, aligned=True),
 int64,
 int64,
 int64,
 int64,
 int64,
 UniTuple(int64, 6),
 UniTuple(int64, 6))

And numba generates a quite verbose LLVM code (which I cannot read)

Click me
In [6]: print(numba_transpose_reshape.inspect_llvm(numba_transpose_reshape.signatures[0]))
; ModuleID = 'numba_transpose_reshape'
source_filename = "<string>"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@.const.pickledata.139740390420480 = internal constant [70 x i8] c"\80\04\95;\00\00\00\00\00\00\00\8C\08builtins\94\8C\0AIndexError\94\93\94\8C\18tuple index out of range\94\85\94N\87\94."
@.const.pickledata.139740390420480.sha1 = internal constant [20 x i8] c"\A82\A7\F8\17\\%0i*\B8.X\1E$k\F5dj("
@.const.picklebuf.139740390420480 = internal constant { i8*, i32, i8*, i8*, i32 } { i8* getelementptr inbounds ([70 x i8], [70 x i8]* @.const.pickledata.139740390420480, i32 0, i32 0), i32 70, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.const.pickledata.139740390420480.sha1, i32 0, i32 0), i8* null, i32 0 }
@.const.numba_transpose_reshape = internal constant [24 x i8] c"numba_transpose_reshape\00"
@_ZN08NumbaEnv9froSTspin10misc_tools11numba_tools23numba_transpose_reshapeB3v50B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE5ArrayIdLi2E1C8readonly7alignedExxxxx8UniTupleIxLi6EE8UniTupleIxLi6EE = common local_unnamed_addr global i8* null
@".const.missing Environment: _ZN08NumbaEnv9froSTspin10misc_tools11numba_tools23numba_transpose_reshapeB3v50B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE5ArrayIdLi2E1C8readonly7alignedExxxxx8UniTupleIxLi6EE8UniTupleIxLi6EE" = internal constant [211 x i8] c"missing Environment: _ZN08NumbaEnv9froSTspin10misc_tools11numba_tools23numba_transpose_reshapeB3v50B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE5ArrayIdLi2E1C8readonly7alignedExxxxx8UniTupleIxLi6EE8UniTupleIxLi6EE\00"
@PyExc_TypeError = external global i8
@".const.can't unbox array from PyObject into native value.  The object maybe of a different type" = internal constant [89 x i8] c"can't unbox array from PyObject into native value.  The object maybe of a different type\00"
@".const.size mismatch for tuple, expected 6 element(s) but got %zd" = internal constant [59 x i8] c"size mismatch for tuple, expected 6 element(s) but got %zd\00"
@_Py_NoneStruct = external global i8
@".const.`env.consts` is NULL in `read_const`" = internal constant [37 x i8] c"`env.consts` is NULL in `read_const`\00"
@.const.pickledata.139741320154272 = internal constant [32 x i8] c"\80\04\95\15\00\00\00\00\00\00\00\8C\05numpy\94\8C\07ndarray\94\93\94."
@.const.pickledata.139741320154272.sha1 = internal constant [20 x i8] c"\DF\BC\FD\D3\9F\CB&\F4\D0\C6\80\95D\87\B8\C0\B5;\B8\A3"
@".const.Error creating Python tuple from runtime exception arguments" = internal constant [61 x i8] c"Error creating Python tuple from runtime exception arguments\00"
@".const.unknown error when calling native function" = internal constant [43 x i8] c"unknown error when calling native function\00"
@".const.Error creating Python tuple from runtime exception arguments.1" = internal constant [61 x i8] c"Error creating Python tuple from runtime exception arguments\00"
@".const.unknown error when calling native function.2" = internal constant [43 x i8] c"unknown error when calling native function\00"
@".const.<numba.core.cpu.CPUContext object at 0x7f17d8920580>" = internal constant [53 x i8] c"<numba.core.cpu.CPUContext object at 0x7f17d8920580>\00"
@.const.pickledata.139740397330368 = internal constant [70 x i8] c"\80\04\95;\00\00\00\00\00\00\00\8C\08builtins\94\8C\0AIndexError\94\93\94\8C\18tuple index out of range\94\85\94N\87\94."
@.const.pickledata.139740397330368.sha1 = internal constant [20 x i8] c"\A82\A7\F8\17\\%0i*\B8.X\1E$k\F5dj("
@.const.picklebuf.139740397330368 = internal constant { i8*, i32, i8*, i8*, i32 } { i8* getelementptr inbounds ([70 x i8], [70 x i8]* @.const.pickledata.139740397330368, i32 0, i32 0), i32 70, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.const.pickledata.139740397330368.sha1, i32 0, i32 0), i8* null, i32 0 }
@_ZN08NumbaEnv9froSTspin10misc_tools11numba_tools28numba_compute_tensor_stridesB3v51B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE8UniTupleIxLi2EEx8UniTupleIxLi6EE = common local_unnamed_addr global i8* null
@PyExc_ValueError = external global i8
@PyExc_StopIteration = external global i8
@.const.pickledata.139740397001280 = internal constant [86 x i8] c"\80\04\95K\00\00\00\00\00\00\00\8C\08builtins\94\8C\0BMemoryError\94\93\94\8C'Allocation failed (probably too large).\94\85\94N\87\94."
@.const.pickledata.139740397001280.sha1 = internal constant [20 x i8] c"\BA(\9D\81\F0\\p \F3G|\15sH\04\DFe\AB\E2\09"
@.const.picklebuf.139740397001280 = internal constant { i8*, i32, i8*, i8*, i32 } { i8* getelementptr inbounds ([86 x i8], [86 x i8]* @.const.pickledata.139740397001280, i32 0, i32 0), i32 86, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.const.pickledata.139740397001280.sha1, i32 0, i32 0), i8* null, i32 0 }
@_ZN08NumbaEnv5numba2np8arrayobj11ol_np_empty12_3clocals_3e4implB3v16B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE8UniTupleIxLi1EE16class_28int64_29 = common local_unnamed_addr global i8* null
@PyExc_RuntimeError = external global i8
@PyExc_SystemError = external global i8
@_ZN08NumbaEnv5numba2np8arrayobj15_call_allocatorB2v5B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj = common local_unnamed_addr global i8* null
@_ZN08NumbaEnv5numba2np8arrayobj18_ol_array_allocate12_3clocals_3e4implB2v6B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj = common local_unnamed_addr global i8* null
@.const.pickledata.139740397001280.10 = internal constant [86 x i8] c"\80\04\95K\00\00\00\00\00\00\00\8C\08builtins\94\8C\0BMemoryError\94\93\94\8C'Allocation failed (probably too large).\94\85\94N\87\94."
@.const.pickledata.139740397001280.sha1.11 = internal constant [20 x i8] c"\BA(\9D\81\F0\\p \F3G|\15sH\04\DFe\AB\E2\09"
@.const.picklebuf.139740397001280.9 = internal constant { i8*, i32, i8*, i8*, i32 } { i8* getelementptr inbounds ([86 x i8], [86 x i8]* @.const.pickledata.139740397001280.10, i32 0, i32 0), i32 86, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.const.pickledata.139740397001280.sha1.11, i32 0, i32 0), i8* null, i32 0 }
@_ZN08NumbaEnv5numba2np6unsafe7ndarray14to_fixed_tuple12_3clocals_3e7codegen12_3clocals_3e4implB3v55B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAE5ArrayIxLi1E1C7mutable7alignedEx8UniTupleIxLi6EE = common local_unnamed_addr global i8* null
@_ZN08NumbaEnv5numba2np8arrayobj10as_strided12_3clocals_3e15as_strided_implB3v52B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE5ArrayIdLi2E1A8readonly7alignedE8UniTupleIxLi6EE8UniTupleIxLi6EE = common local_unnamed_addr global i8* null
@_ZN08NumbaEnv5numba2np8arrayobj10as_strided12_3clocals_3e9get_shapeB3v53B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE5ArrayIdLi2E1A8readonly7alignedE8UniTupleIxLi6EE = common local_unnamed_addr global i8* null
@_ZN08NumbaEnv5numba2np8arrayobj10as_strided12_3clocals_3e11get_stridesB3v54B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE5ArrayIdLi2E1A8readonly7alignedE8UniTupleIxLi6EE = common local_unnamed_addr global i8* null

define i32 @_ZN9froSTspin10misc_tools11numba_tools23numba_transpose_reshapeB3v50B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE5ArrayIdLi2E1C8readonly7alignedExxxxx8UniTupleIxLi6EE8UniTupleIxLi6EE({ i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* noalias nocapture writeonly %retptr, { i8*, i32, i8*, i8*, i32 }** noalias nocapture writeonly %excinfo, i8* %arg.old_mat.0, i8* nocapture readnone %arg.old_mat.1, i64 %arg.old_mat.2, i64 %arg.old_mat.3, double* %arg.old_mat.4, i64 %arg.old_mat.5.0, i64 %arg.old_mat.5.1, i64 %arg.old_mat.6.0, i64 %arg.old_mat.6.1, i64 %arg.r1, i64 %arg.r2, i64 %arg.c1, i64 %arg.c2, i64 %arg.old_nrr, i64 %arg.old_tensor_shape.0, i64 %arg.old_tensor_shape.1, i64 %arg.old_tensor_shape.2, i64 %arg.old_tensor_shape.3, i64 %arg.old_tensor_shape.4, i64 %arg.old_tensor_shape.5, i64 %arg.perm.0, i64 %arg.perm.1, i64 %arg.perm.2, i64 %arg.perm.3, i64 %arg.perm.4, i64 %arg.perm.5) local_unnamed_addr {
entry:
  %.89 = alloca { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }, align 8
  %.fca.0.gep335155 = bitcast { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %.89 to i8**
  %.fca.4.gep339 = getelementptr inbounds { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }, { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %.89, i64 0, i32 4
  %.fca.5.0.gep340 = getelementptr inbounds { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }, { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %.89, i64 0, i32 5, i64 0
  %excinfo.1 = alloca { i8*, i32, i8*, i8*, i32 }*, align 8
  store { i8*, i32, i8*, i8*, i32 }* null, { i8*, i32, i8*, i8*, i32 }** %excinfo.1, align 8
  tail call void @NRT_incref(i8* %arg.old_mat.0)
  %0 = bitcast { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %.89 to i8*
  call void @llvm.memset.p0i8.i64(i8* noundef nonnull align 8 dereferenceable(56) %0, i8 0, i64 56, i1 false)
  %.101 = call i32 @_ZN9froSTspin10misc_tools11numba_tools28numba_compute_tensor_stridesB3v51B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE8UniTupleIxLi2EEx8UniTupleIxLi6EE({ i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* nonnull %.89, { i8*, i32, i8*, i8*, i32 }** nonnull %excinfo.1, i64 %arg.old_mat.6.0, i64 %arg.old_mat.6.1, i64 %arg.old_nrr, i64 %arg.old_tensor_shape.0, i64 %arg.old_tensor_shape.1, i64 %arg.old_tensor_shape.2, i64 %arg.old_tensor_shape.3, i64 %arg.old_tensor_shape.4, i64 %arg.old_tensor_shape.5)
  %.111.fca.0.load = load i8*, i8** %.fca.0.gep335155, align 8
  %.111.fca.4.load = load i64*, i64** %.fca.4.gep339, align 8
  %.111.fca.5.0.load = load i64, i64* %.fca.5.0.gep340, align 8
  switch i32 %.101, label %B0.if [
    i32 -2, label %B0.endif
    i32 0, label %B0.endif
  ]

B0.if:                                            ; preds = %entry
  %.109 = icmp sgt i32 %.101, 0
  %.102 = load { i8*, i32, i8*, i8*, i32 }*, { i8*, i32, i8*, i8*, i32 }** %excinfo.1, align 8
  %.110 = select i1 %.109, { i8*, i32, i8*, i8*, i32 }* %.102, { i8*, i32, i8*, i8*, i32 }* undef
  store { i8*, i32, i8*, i8*, i32 }* %.110, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8
  br label %common.ret

B0.endif:                                         ; preds = %entry, %entry
  %.7.i.i.i = tail call i8* @NRT_MemInfo_alloc_aligned(i64 48, i32 32), !noalias !0
  %.8.i.i.i = icmp eq i8* %.7.i.i.i, null
  br i1 %.8.i.i.i, label %B0.endif.if, label %B0.endif.endif, !prof !10

common.ret:                                       ; preds = %B0.endif.endif.if, %B0.endif.if, %B0.if, %B106.endif.endif.endif.endif.endif, %switch.else.1
  %common.ret.op = phi i32 [ 1, %switch.else.1 ], [ 0, %B106.endif.endif.endif.endif.endif ], [ %.101, %B0.if ], [ 1, %B0.endif.if ], [ 1, %B0.endif.endif.if ]
  ret i32 %common.ret.op

B0.endif.if:                                      ; preds = %B0.endif
  store { i8*, i32, i8*, i8*, i32 }* @.const.picklebuf.139740397001280.9, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8
  br label %common.ret

B0.endif.endif:                                   ; preds = %B0.endif
  %.5.i.i = getelementptr i8, i8* %.7.i.i.i, i64 24
  %1 = bitcast i8* %.5.i.i to i64**
  %.6.i1.i = load i64*, i64** %1, align 8, !noalias !11
  %.7.i.i.i2 = tail call i8* @NRT_MemInfo_alloc_aligned(i64 48, i32 32), !noalias !12
  %.8.i.i.i3 = icmp eq i8* %.7.i.i.i2, null
  br i1 %.8.i.i.i3, label %B0.endif.endif.if, label %switch.end, !prof !10

B0.endif.endif.if:                                ; preds = %B0.endif.endif
  store { i8*, i32, i8*, i8*, i32 }* @.const.picklebuf.139740397001280.9, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8
  br label %common.ret

switch.end:                                       ; preds = %B0.endif.endif
  %.5.i.i5 = getelementptr i8, i8* %.7.i.i.i2, i64 24
  %2 = bitcast i8* %.5.i.i5 to i64**
  %.6.i1.i6 = load i64*, i64** %2, align 8, !noalias !22
  switch i64 %arg.perm.0, label %switch.else.1 [
    i64 0, label %switch.end.1125
    i64 -6, label %switch.end.1125
    i64 1, label %switch.1.1
    i64 -5, label %switch.1.1
    i64 2, label %switch.2.1
    i64 -4, label %switch.2.1
    i64 3, label %switch.3.1
    i64 -3, label %switch.3.1
    i64 4, label %switch.4.1
    i64 -2, label %switch.4.1
    i64 5, label %switch.5.1
    i64 -1, label %switch.5.1
  ]

switch.else.1:                                    ; preds = %switch.end.5, %switch.end.4, %switch.end.3, %switch.end.2131, %switch.end.1125, %switch.end
  store { i8*, i32, i8*, i8*, i32 }* @.const.picklebuf.139740390420480, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8, !numba_exception_output !23
  br label %common.ret

switch.1.1:                                       ; preds = %switch.end, %switch.end
  br label %switch.end.1125

switch.2.1:                                       ; preds = %switch.end, %switch.end
  br label %switch.end.1125

switch.3.1:                                       ; preds = %switch.end, %switch.end
  br label %switch.end.1125

switch.4.1:                                       ; preds = %switch.end, %switch.end
  br label %switch.end.1125

switch.5.1:                                       ; preds = %switch.end, %switch.end
  br label %switch.end.1125

switch.end.1125:                                  ; preds = %switch.1.1, %switch.2.1, %switch.3.1, %switch.4.1, %switch.5.1, %switch.end, %switch.end
  %.383 = phi i64 [ %arg.old_tensor_shape.1, %switch.1.1 ], [ %arg.old_tensor_shape.2, %switch.2.1 ], [ %arg.old_tensor_shape.3, %switch.3.1 ], [ %arg.old_tensor_shape.4, %switch.4.1 ], [ %arg.old_tensor_shape.5, %switch.5.1 ], [ %arg.old_tensor_shape.0, %switch.end ], [ %arg.old_tensor_shape.0, %switch.end ]
  store i64 %.383, i64* %.6.i1.i, align 8
  %.459 = icmp slt i64 %arg.perm.0, 0
  %.460 = select i1 %.459, i64 %.111.fca.5.0.load, i64 0
  %.461 = add i64 %.460, %arg.perm.0
  %.474 = getelementptr i64, i64* %.111.fca.4.load, i64 %.461
  %.475 = load i64, i64* %.474, align 8
  store i64 %.475, i64* %.6.i1.i6, align 8
  switch i64 %arg.perm.1, label %switch.else.1 [
    i64 0, label %switch.end.2131
    i64 -6, label %switch.end.2131
    i64 1, label %switch.1.1.1
    i64 -5, label %switch.1.1.1
    i64 2, label %switch.2.1.1
    i64 -4, label %switch.2.1.1
    i64 3, label %switch.3.1.1
    i64 -3, label %switch.3.1.1
    i64 4, label %switch.4.1.1
    i64 -2, label %switch.4.1.1
    i64 5, label %switch.5.1.1
    i64 -1, label %switch.5.1.1
  ]

switch.5.1.1:                                     ; preds = %switch.end.1125, %switch.end.1125
  br label %switch.end.2131

switch.4.1.1:                                     ; preds = %switch.end.1125, %switch.end.1125
  br label %switch.end.2131

switch.3.1.1:                                     ; preds = %switch.end.1125, %switch.end.1125
  br label %switch.end.2131

switch.2.1.1:                                     ; preds = %switch.end.1125, %switch.end.1125
  br label %switch.end.2131

switch.1.1.1:                                     ; preds = %switch.end.1125, %switch.end.1125
  br label %switch.end.2131

switch.end.2131:                                  ; preds = %switch.1.1.1, %switch.2.1.1, %switch.3.1.1, %switch.4.1.1, %switch.5.1.1, %switch.end.1125, %switch.end.1125
  %.383.1 = phi i64 [ %arg.old_tensor_shape.1, %switch.1.1.1 ], [ %arg.old_tensor_shape.2, %switch.2.1.1 ], [ %arg.old_tensor_shape.3, %switch.3.1.1 ], [ %arg.old_tensor_shape.4, %switch.4.1.1 ], [ %arg.old_tensor_shape.5, %switch.5.1.1 ], [ %arg.old_tensor_shape.0, %switch.end.1125 ], [ %arg.old_tensor_shape.0, %switch.end.1125 ]
  %.424.1 = getelementptr i64, i64* %.6.i1.i, i64 1
  store i64 %.383.1, i64* %.424.1, align 8
  %.459.1 = icmp slt i64 %arg.perm.1, 0
  %.460.1 = select i1 %.459.1, i64 %.111.fca.5.0.load, i64 0
  %.461.1 = add i64 %.460.1, %arg.perm.1
  %.474.1 = getelementptr i64, i64* %.111.fca.4.load, i64 %.461.1
  %.475.1 = load i64, i64* %.474.1, align 8
  %.504.1 = getelementptr i64, i64* %.6.i1.i6, i64 1
  store i64 %.475.1, i64* %.504.1, align 8
  switch i64 %arg.perm.2, label %switch.else.1 [
    i64 0, label %switch.end.3
    i64 -6, label %switch.end.3
    i64 1, label %switch.1.1.2
    i64 -5, label %switch.1.1.2
    i64 2, label %switch.2.1.2
    i64 -4, label %switch.2.1.2
    i64 3, label %switch.3.1.2
    i64 -3, label %switch.3.1.2
    i64 4, label %switch.4.1.2
    i64 -2, label %switch.4.1.2
    i64 5, label %switch.5.1.2
    i64 -1, label %switch.5.1.2
  ]

switch.5.1.2:                                     ; preds = %switch.end.2131, %switch.end.2131
  br label %switch.end.3

switch.4.1.2:                                     ; preds = %switch.end.2131, %switch.end.2131
  br label %switch.end.3

switch.3.1.2:                                     ; preds = %switch.end.2131, %switch.end.2131
  br label %switch.end.3

switch.2.1.2:                                     ; preds = %switch.end.2131, %switch.end.2131
  br label %switch.end.3

switch.1.1.2:                                     ; preds = %switch.end.2131, %switch.end.2131
  br label %switch.end.3

switch.end.3:                                     ; preds = %switch.1.1.2, %switch.2.1.2, %switch.3.1.2, %switch.4.1.2, %switch.5.1.2, %switch.end.2131, %switch.end.2131
  %.383.2 = phi i64 [ %arg.old_tensor_shape.1, %switch.1.1.2 ], [ %arg.old_tensor_shape.2, %switch.2.1.2 ], [ %arg.old_tensor_shape.3, %switch.3.1.2 ], [ %arg.old_tensor_shape.4, %switch.4.1.2 ], [ %arg.old_tensor_shape.5, %switch.5.1.2 ], [ %arg.old_tensor_shape.0, %switch.end.2131 ], [ %arg.old_tensor_shape.0, %switch.end.2131 ]
  %.424.2 = getelementptr i64, i64* %.6.i1.i, i64 2
  store i64 %.383.2, i64* %.424.2, align 8
  %.459.2 = icmp slt i64 %arg.perm.2, 0
  %.460.2 = select i1 %.459.2, i64 %.111.fca.5.0.load, i64 0
  %.461.2 = add i64 %.460.2, %arg.perm.2
  %.474.2 = getelementptr i64, i64* %.111.fca.4.load, i64 %.461.2
  %.475.2 = load i64, i64* %.474.2, align 8
  %.504.2 = getelementptr i64, i64* %.6.i1.i6, i64 2
  store i64 %.475.2, i64* %.504.2, align 8
  switch i64 %arg.perm.3, label %switch.else.1 [
    i64 0, label %switch.end.4
    i64 -6, label %switch.end.4
    i64 1, label %switch.1.1.3
    i64 -5, label %switch.1.1.3
    i64 2, label %switch.2.1.3
    i64 -4, label %switch.2.1.3
    i64 3, label %switch.3.1.3
    i64 -3, label %switch.3.1.3
    i64 4, label %switch.4.1.3
    i64 -2, label %switch.4.1.3
    i64 5, label %switch.5.1.3
    i64 -1, label %switch.5.1.3
  ]

switch.5.1.3:                                     ; preds = %switch.end.3, %switch.end.3
  br label %switch.end.4

switch.4.1.3:                                     ; preds = %switch.end.3, %switch.end.3
  br label %switch.end.4

switch.3.1.3:                                     ; preds = %switch.end.3, %switch.end.3
  br label %switch.end.4

switch.2.1.3:                                     ; preds = %switch.end.3, %switch.end.3
  br label %switch.end.4

switch.1.1.3:                                     ; preds = %switch.end.3, %switch.end.3
  br label %switch.end.4

switch.end.4:                                     ; preds = %switch.1.1.3, %switch.2.1.3, %switch.3.1.3, %switch.4.1.3, %switch.5.1.3, %switch.end.3, %switch.end.3
  %.383.3 = phi i64 [ %arg.old_tensor_shape.1, %switch.1.1.3 ], [ %arg.old_tensor_shape.2, %switch.2.1.3 ], [ %arg.old_tensor_shape.3, %switch.3.1.3 ], [ %arg.old_tensor_shape.4, %switch.4.1.3 ], [ %arg.old_tensor_shape.5, %switch.5.1.3 ], [ %arg.old_tensor_shape.0, %switch.end.3 ], [ %arg.old_tensor_shape.0, %switch.end.3 ]
  %.424.3 = getelementptr i64, i64* %.6.i1.i, i64 3
  store i64 %.383.3, i64* %.424.3, align 8
  %.459.3 = icmp slt i64 %arg.perm.3, 0
  %.460.3 = select i1 %.459.3, i64 %.111.fca.5.0.load, i64 0
  %.461.3 = add i64 %.460.3, %arg.perm.3
  %.474.3 = getelementptr i64, i64* %.111.fca.4.load, i64 %.461.3
  %.475.3 = load i64, i64* %.474.3, align 8
  %.504.3 = getelementptr i64, i64* %.6.i1.i6, i64 3
  store i64 %.475.3, i64* %.504.3, align 8
  switch i64 %arg.perm.4, label %switch.else.1 [
    i64 0, label %switch.end.5
    i64 -6, label %switch.end.5
    i64 1, label %switch.1.1.4
    i64 -5, label %switch.1.1.4
    i64 2, label %switch.2.1.4
    i64 -4, label %switch.2.1.4
    i64 3, label %switch.3.1.4
    i64 -3, label %switch.3.1.4
    i64 4, label %switch.4.1.4
    i64 -2, label %switch.4.1.4
    i64 5, label %switch.5.1.4
    i64 -1, label %switch.5.1.4
  ]

switch.5.1.4:                                     ; preds = %switch.end.4, %switch.end.4
  br label %switch.end.5

switch.4.1.4:                                     ; preds = %switch.end.4, %switch.end.4
  br label %switch.end.5

switch.3.1.4:                                     ; preds = %switch.end.4, %switch.end.4
  br label %switch.end.5

switch.2.1.4:                                     ; preds = %switch.end.4, %switch.end.4
  br label %switch.end.5

switch.1.1.4:                                     ; preds = %switch.end.4, %switch.end.4
  br label %switch.end.5

switch.end.5:                                     ; preds = %switch.1.1.4, %switch.2.1.4, %switch.3.1.4, %switch.4.1.4, %switch.5.1.4, %switch.end.4, %switch.end.4
  %.383.4 = phi i64 [ %arg.old_tensor_shape.1, %switch.1.1.4 ], [ %arg.old_tensor_shape.2, %switch.2.1.4 ], [ %arg.old_tensor_shape.3, %switch.3.1.4 ], [ %arg.old_tensor_shape.4, %switch.4.1.4 ], [ %arg.old_tensor_shape.5, %switch.5.1.4 ], [ %arg.old_tensor_shape.0, %switch.end.4 ], [ %arg.old_tensor_shape.0, %switch.end.4 ]
  %.424.4 = getelementptr i64, i64* %.6.i1.i, i64 4
  store i64 %.383.4, i64* %.424.4, align 8
  %.459.4 = icmp slt i64 %arg.perm.4, 0
  %.460.4 = select i1 %.459.4, i64 %.111.fca.5.0.load, i64 0
  %.461.4 = add i64 %.460.4, %arg.perm.4
  %.474.4 = getelementptr i64, i64* %.111.fca.4.load, i64 %.461.4
  %.475.4 = load i64, i64* %.474.4, align 8
  %.504.4 = getelementptr i64, i64* %.6.i1.i6, i64 4
  store i64 %.475.4, i64* %.504.4, align 8
  switch i64 %arg.perm.5, label %switch.else.1 [
    i64 0, label %switch.end.2.5
    i64 -6, label %switch.end.2.5
    i64 1, label %switch.1.1.5
    i64 -5, label %switch.1.1.5
    i64 2, label %switch.2.1.5
    i64 -4, label %switch.2.1.5
    i64 3, label %switch.3.1.5
    i64 -3, label %switch.3.1.5
    i64 4, label %switch.4.1.5
    i64 -2, label %switch.4.1.5
    i64 5, label %switch.5.1.5
    i64 -1, label %switch.5.1.5
  ]

switch.5.1.5:                                     ; preds = %switch.end.5, %switch.end.5
  br label %switch.end.2.5

switch.4.1.5:                                     ; preds = %switch.end.5, %switch.end.5
  br label %switch.end.2.5

switch.3.1.5:                                     ; preds = %switch.end.5, %switch.end.5
  br label %switch.end.2.5

switch.2.1.5:                                     ; preds = %switch.end.5, %switch.end.5
  br label %switch.end.2.5

switch.1.1.5:                                     ; preds = %switch.end.5, %switch.end.5
  br label %switch.end.2.5

switch.end.2.5:                                   ; preds = %switch.1.1.5, %switch.2.1.5, %switch.3.1.5, %switch.4.1.5, %switch.5.1.5, %switch.end.5, %switch.end.5
  %.383.5 = phi i64 [ %arg.old_tensor_shape.1, %switch.1.1.5 ], [ %arg.old_tensor_shape.2, %switch.2.1.5 ], [ %arg.old_tensor_shape.3, %switch.3.1.5 ], [ %arg.old_tensor_shape.4, %switch.4.1.5 ], [ %arg.old_tensor_shape.5, %switch.5.1.5 ], [ %arg.old_tensor_shape.0, %switch.end.5 ], [ %arg.old_tensor_shape.0, %switch.end.5 ]
  %.424.5 = getelementptr i64, i64* %.6.i1.i, i64 5
  store i64 %.383.5, i64* %.424.5, align 8
  %.459.5 = icmp slt i64 %arg.perm.5, 0
  %.460.5 = select i1 %.459.5, i64 %.111.fca.5.0.load, i64 0
  %.461.5 = add i64 %.460.5, %arg.perm.5
  %.474.5 = getelementptr i64, i64* %.111.fca.4.load, i64 %.461.5
  %.475.5 = load i64, i64* %.474.5, align 8
  %.504.5 = getelementptr i64, i64* %.6.i1.i6, i64 5
  store i64 %.475.5, i64* %.504.5, align 8
  tail call void @NRT_decref(i8* %.111.fca.0.load)
  %.218.i = load i64, i64* %.6.i1.i, align 8, !noalias !24
  %3 = bitcast i64* %.6.i1.i to i8*
  %sunkaddr = getelementptr i8, i8* %3, i64 8
  %4 = bitcast i8* %sunkaddr to i64*
  %.218.1.i = load i64, i64* %4, align 8, !noalias !24
  %5 = bitcast i64* %.6.i1.i to i8*
  %sunkaddr156 = getelementptr i8, i8* %5, i64 16
  %6 = bitcast i8* %sunkaddr156 to i64*
  %.218.i.1 = load i64, i64* %6, align 8, !noalias !24
  %sunkaddr509.i.1 = getelementptr i64, i64* %.6.i1.i, i64 3
  %.218.1.i.1 = load i64, i64* %sunkaddr509.i.1, align 8, !noalias !24
  %7 = bitcast i64* %.6.i1.i to i8*
  %sunkaddr157 = getelementptr i8, i8* %7, i64 32
  %8 = bitcast i8* %sunkaddr157 to i64*
  %.218.i.2 = load i64, i64* %8, align 8, !noalias !24
  %sunkaddr509.i.2 = getelementptr i64, i64* %.6.i1.i, i64 5
  %.218.1.i.2 = load i64, i64* %sunkaddr509.i.2, align 8, !noalias !24
  tail call void @NRT_decref(i8* nonnull %.7.i.i.i)
  %.218.i23 = load i64, i64* %.6.i1.i6, align 8, !noalias !27
  %9 = bitcast i64* %.6.i1.i6 to i8*
  %sunkaddr158 = getelementptr i8, i8* %9, i64 8
  %10 = bitcast i8* %sunkaddr158 to i64*
  %.218.1.i39 = load i64, i64* %10, align 8, !noalias !27
  %11 = bitcast i64* %.6.i1.i6 to i8*
  %sunkaddr159 = getelementptr i8, i8* %11, i64 16
  %12 = bitcast i8* %sunkaddr159 to i64*
  %.218.i23.1 = load i64, i64* %12, align 8, !noalias !27
  %sunkaddr509.i38.1 = getelementptr i64, i64* %.6.i1.i6, i64 3
  %.218.1.i39.1 = load i64, i64* %sunkaddr509.i38.1, align 8, !noalias !27
  %13 = bitcast i64* %.6.i1.i6 to i8*
  %sunkaddr160 = getelementptr i8, i8* %13, i64 32
  %14 = bitcast i8* %sunkaddr160 to i64*
  %.218.i23.2 = load i64, i64* %14, align 8, !noalias !27
  %sunkaddr509.i38.2 = getelementptr i64, i64* %.6.i1.i6, i64 5
  %.218.1.i39.2 = load i64, i64* %sunkaddr509.i38.2, align 8, !noalias !27
  tail call void @NRT_decref(i8* nonnull %.7.i.i.i2)
  %.684 = icmp slt i64 %arg.r1, 0
  %.685 = select i1 %.684, i64 %arg.old_mat.5.0, i64 0
  %.686 = add i64 %.685, %arg.r1
  %.689 = icmp slt i64 %.686, 0
  br i1 %.689, label %B106.endif.endif.else.if, label %B106.endif.endif.else.endif, !prof !10

B106.endif.endif.else.if:                         ; preds = %switch.end.2.5
  br label %B106.endif.endif.else.endif

B106.endif.endif.else.endif:                      ; preds = %B106.endif.endif.else.if, %switch.end.2.5
  %.674.sroa.0.1 = phi i64 [ 0, %B106.endif.endif.else.if ], [ %.686, %switch.end.2.5 ]
  %.694.not = icmp slt i64 %.686, %arg.old_mat.5.0
  br i1 %.694.not, label %B106.endif.endif.endif.else, label %B106.endif.endif.else.endif.if, !prof !30

B106.endif.endif.else.endif.if:                   ; preds = %B106.endif.endif.else.endif
  br label %B106.endif.endif.endif.else

B106.endif.endif.endif.else:                      ; preds = %B106.endif.endif.else.endif.if, %B106.endif.endif.else.endif
  %.674.sroa.0.2 = phi i64 [ %arg.old_mat.5.0, %B106.endif.endif.else.endif.if ], [ %.674.sroa.0.1, %B106.endif.endif.else.endif ]
  %.785 = icmp slt i64 %arg.c1, 0
  %.786 = select i1 %.785, i64 %arg.old_mat.5.1, i64 0
  %.787 = add i64 %.786, %arg.c1
  %.790 = icmp slt i64 %.787, 0
  br i1 %.790, label %B106.endif.endif.endif.else.if, label %B106.endif.endif.endif.else.endif, !prof !10

B106.endif.endif.endif.else.if:                   ; preds = %B106.endif.endif.endif.else
  br label %B106.endif.endif.endif.else.endif

B106.endif.endif.endif.else.endif:                ; preds = %B106.endif.endif.endif.else.if, %B106.endif.endif.endif.else
  %.775.sroa.0.1 = phi i64 [ 0, %B106.endif.endif.endif.else.if ], [ %.787, %B106.endif.endif.endif.else ]
  %.795.not = icmp slt i64 %.787, %arg.old_mat.5.1
  br i1 %.795.not, label %B106.endif.endif.endif.endif.endif, label %B106.endif.endif.endif.else.endif.if, !prof !30

B106.endif.endif.endif.else.endif.if:             ; preds = %B106.endif.endif.endif.else.endif
  br label %B106.endif.endif.endif.endif.endif

B106.endif.endif.endif.endif.endif:               ; preds = %B106.endif.endif.endif.else.endif.if, %B106.endif.endif.endif.else.endif
  %.775.sroa.0.2 = phi i64 [ %arg.old_mat.5.1, %B106.endif.endif.endif.else.endif.if ], [ %.775.sroa.0.1, %B106.endif.endif.endif.else.endif ]
  %.892 = mul i64 %.674.sroa.0.2, %arg.old_mat.5.1
  %.895 = add i64 %.775.sroa.0.2, %.892
  %.896 = getelementptr double, double* %arg.old_mat.4, i64 %.895
  %.184.i = mul nsw i64 %.218.1.i, %.218.i
  %.185.i = mul nsw i64 %.184.i, %.218.i.1
  %.186.i = mul nsw i64 %.185.i, %.218.1.i.1
  %.187.i = mul nsw i64 %.186.i, %.218.i.2
  %.188.i = mul nsw i64 %.187.i, %.218.1.i.2
  %retptr.repack161 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr to i8**
  store i8* %arg.old_mat.0, i8** %retptr.repack161, align 8
  %retptr.repack59 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 1
  store i8* null, i8** %retptr.repack59, align 8
  %retptr.repack61 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 2
  store i64 %.188.i, i64* %retptr.repack61, align 8
  %retptr.repack63 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 3
  store i64 %arg.old_mat.3, i64* %retptr.repack63, align 8
  %retptr.repack65 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 4
  store double* %.896, double** %retptr.repack65, align 8
  %retptr.repack67.repack = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 5, i64 0
  store i64 %.218.i, i64* %retptr.repack67.repack, align 8
  %retptr.repack67.repack71 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 5, i64 1
  store i64 %.218.1.i, i64* %retptr.repack67.repack71, align 8
  %retptr.repack67.repack73 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 5, i64 2
  store i64 %.218.i.1, i64* %retptr.repack67.repack73, align 8
  %retptr.repack67.repack75 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 5, i64 3
  store i64 %.218.1.i.1, i64* %retptr.repack67.repack75, align 8
  %retptr.repack67.repack77 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 5, i64 4
  store i64 %.218.i.2, i64* %retptr.repack67.repack77, align 8
  %retptr.repack67.repack79 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 5, i64 5
  store i64 %.218.1.i.2, i64* %retptr.repack67.repack79, align 8
  %retptr.repack69.repack = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 6, i64 0
  store i64 %.218.i23, i64* %retptr.repack69.repack, align 8
  %retptr.repack69.repack81 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 6, i64 1
  store i64 %.218.1.i39, i64* %retptr.repack69.repack81, align 8
  %retptr.repack69.repack83 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 6, i64 2
  store i64 %.218.i23.1, i64* %retptr.repack69.repack83, align 8
  %retptr.repack69.repack85 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 6, i64 3
  store i64 %.218.1.i39.1, i64* %retptr.repack69.repack85, align 8
  %retptr.repack69.repack87 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 6, i64 4
  store i64 %.218.i23.2, i64* %retptr.repack69.repack87, align 8
  %retptr.repack69.repack89 = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %retptr, i64 0, i32 6, i64 5
  store i64 %.218.1.i39.2, i64* %retptr.repack69.repack89, align 8
  br label %common.ret
}

define i8* @_ZN7cpython9froSTspin10misc_tools11numba_tools23numba_transpose_reshapeB3v50B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE5ArrayIdLi2E1C8readonly7alignedExxxxx8UniTupleIxLi6EE8UniTupleIxLi6EE(i8* nocapture readnone %py_closure, i8* %py_args, i8* nocapture readnone %py_kws) local_unnamed_addr {
entry:
  %.5 = alloca i8*, align 8
  %.6 = alloca i8*, align 8
  %.7 = alloca i8*, align 8
  %.8 = alloca i8*, align 8
  %.9 = alloca i8*, align 8
  %.10 = alloca i8*, align 8
  %.11 = alloca i8*, align 8
  %.12 = alloca i8*, align 8
  %.13 = call i32 (i8*, i8*, i64, i64, ...) @PyArg_UnpackTuple(i8* %py_args, i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.const.numba_transpose_reshape, i64 0, i64 0), i64 8, i64 8, i8** nonnull %.5, i8** nonnull %.6, i8** nonnull %.7, i8** nonnull %.8, i8** nonnull %.9, i8** nonnull %.10, i8** nonnull %.11, i8** nonnull %.12)
  %.14 = icmp eq i32 %.13, 0
  %.28 = alloca { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] }, align 8
  %.386 = alloca { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, align 8
  %excinfo = alloca { i8*, i32, i8*, i8*, i32 }*, align 8
  %0 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  call void @llvm.memset.p0i8.i64(i8* noundef nonnull align 8 dereferenceable(136) %0, i8 0, i64 136, i1 false)
  store { i8*, i32, i8*, i8*, i32 }* null, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8
  %.493 = alloca { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, align 8
  %1 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  call void @llvm.memset.p0i8.i64(i8* noundef nonnull align 8 dereferenceable(136) %1, i8 0, i64 136, i1 false)
  br i1 %.14, label %common.ret, label %entry.endif, !prof !10

common.ret:                                       ; preds = %entry.endif.endif.endif.thread, %entry.endif.endif.endif.e...endif.8.endif.endif.endif, %entry.endif.endif.endif.e...endif.8.endif.endif.if.endif, %entry.endif.endif.endif.e...if.10, %entry.endif.endif.endif.e...if.11, %entry.endif.endif.endif.e...endif.11.endif, %arg0.err, %entry, %entry.endif.endif.endif.e...if.9, %entry.endif.endif.endif.e...endif.8.endif.if.endif.endif, %entry.endif.endif.endif.e...endif.8.endif.if.if, %entry.endif.if
  %common.ret.op = phi i8* [ null, %entry.endif.if ], [ @_Py_NoneStruct, %entry.endif.endif.endif.e...endif.8.endif.if.if ], [ %.497, %entry.endif.endif.endif.e...endif.8.endif.if.endif.endif ], [ null, %entry.endif.endif.endif.e...if.9 ], [ null, %entry ], [ null, %arg0.err ], [ null, %entry.endif.endif.endif.e...endif.11.endif ], [ null, %entry.endif.endif.endif.e...if.11 ], [ null, %entry.endif.endif.endif.e...if.10 ], [ null, %entry.endif.endif.endif.e...endif.8.endif.endif.if.endif ], [ null, %entry.endif.endif.endif.e...endif.8.endif.endif.endif ], [ null, %entry.endif.endif.endif.thread ]
  ret i8* %common.ret.op

entry.endif:                                      ; preds = %entry
  %.18 = load i8*, i8** @_ZN08NumbaEnv9froSTspin10misc_tools11numba_tools23numba_transpose_reshapeB3v50B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE5ArrayIdLi2E1C8readonly7alignedExxxxx8UniTupleIxLi6EE8UniTupleIxLi6EE, align 8
  %.23 = icmp eq i8* %.18, null
  br i1 %.23, label %entry.endif.if, label %entry.endif.endif, !prof !10

entry.endif.if:                                   ; preds = %entry.endif
  call void @PyErr_SetString(i8* nonnull @PyExc_RuntimeError, i8* getelementptr inbounds ([211 x i8], [211 x i8]* @".const.missing Environment: _ZN08NumbaEnv9froSTspin10misc_tools11numba_tools23numba_transpose_reshapeB3v50B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE5ArrayIdLi2E1C8readonly7alignedExxxxx8UniTupleIxLi6EE8UniTupleIxLi6EE", i64 0, i64 0))
  br label %common.ret

entry.endif.endif:                                ; preds = %entry.endif
  %.27 = load i8*, i8** %.5, align 8
  %.31 = bitcast { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] }* %.28 to i8*
  %2 = bitcast { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] }* %.28 to i8*
  call void @llvm.memset.p0i8.i64(i8* noundef nonnull align 8 dereferenceable(72) %2, i8 0, i64 72, i1 false)
  %.32 = call i32 @NRT_adapt_ndarray_from_python(i8* %.27, i8* nonnull %.31)
  %3 = bitcast { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] }* %.28 to i8*
  %sunkaddr = getelementptr inbounds i8, i8* %3, i64 24
  %4 = bitcast i8* %sunkaddr to i64*
  %.36 = load i64, i64* %4, align 8
  %.37 = icmp ne i64 %.36, 8
  %.38 = icmp ne i32 %.32, 0
  %.39 = or i1 %.38, %.37
  br i1 %.39, label %entry.endif.endif.endif.thread, label %entry.endif.endif.endif.endif, !prof !10

entry.endif.endif.endif.thread:                   ; preds = %entry.endif.endif
  call void @PyErr_SetString(i8* nonnull @PyExc_TypeError, i8* getelementptr inbounds ([89 x i8], [89 x i8]* @".const.can't unbox array from PyObject into native value.  The object maybe of a different type", i64 0, i64 0))
  br label %common.ret

entry.endif.endif.endif.endif:                    ; preds = %entry.endif.endif
  %5 = bitcast { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] }* %.28 to i8**
  %.43.fca.0.load = load i8*, i8** %5, align 8
  %6 = bitcast { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] }* %.28 to i8*
  %sunkaddr13 = getelementptr inbounds i8, i8* %6, i64 32
  %7 = bitcast i8* %sunkaddr13 to double**
  %.43.fca.4.load = load double*, double** %7, align 8
  %8 = bitcast { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] }* %.28 to i8*
  %sunkaddr14 = getelementptr inbounds i8, i8* %8, i64 40
  %9 = bitcast i8* %sunkaddr14 to i64*
  %.43.fca.5.0.load = load i64, i64* %9, align 8
  %10 = bitcast { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] }* %.28 to i8*
  %sunkaddr15 = getelementptr inbounds i8, i8* %10, i64 48
  %11 = bitcast i8* %sunkaddr15 to i64*
  %.43.fca.5.1.load = load i64, i64* %11, align 8
  %12 = bitcast { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] }* %.28 to i8*
  %sunkaddr16 = getelementptr inbounds i8, i8* %12, i64 56
  %13 = bitcast i8* %sunkaddr16 to i64*
  %.43.fca.6.0.load = load i64, i64* %13, align 8
  %14 = bitcast { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] }* %.28 to i8*
  %sunkaddr17 = getelementptr inbounds i8, i8* %14, i64 64
  %15 = bitcast i8* %sunkaddr17 to i64*
  %.43.fca.6.1.load = load i64, i64* %15, align 8
  %.52 = load i8*, i8** %.6, align 8
  %.55 = call i8* @PyNumber_Long(i8* %.52)
  %.56.not = icmp eq i8* %.55, null
  br i1 %.56.not, label %entry.endif.endif.endif.endif.endif, label %entry.endif.endif.endif.endif.if, !prof !10

arg0.err:                                         ; preds = %entry.endif.endif.endif.e...endif.7.endif.endif.endif, %entry.endif.endif.endif.e...endif.4.endif, %entry.endif.endif.endif.e...endif.1, %entry.endif.endif.endif.e...endif.endif.endif, %entry.endif.endif.endif.e...endif, %entry.endif.endif.endif.endif.endif.endif.endif, %entry.endif.endif.endif.endif.endif
  call void @NRT_decref(i8* %.43.fca.0.load)
  br label %common.ret

entry.endif.endif.endif.endif.if:                 ; preds = %entry.endif.endif.endif.endif
  %.58 = call i64 @PyLong_AsLongLong(i8* nonnull %.55)
  call void @Py_DecRef(i8* nonnull %.55)
  br label %entry.endif.endif.endif.endif.endif

entry.endif.endif.endif.endif.endif:              ; preds = %entry.endif.endif.endif.endif.if, %entry.endif.endif.endif.endif
  %.53.0 = phi i64 [ %.58, %entry.endif.endif.endif.endif.if ], [ 0, %entry.endif.endif.endif.endif ]
  %.63 = call i8* @PyErr_Occurred()
  %.64.not = icmp eq i8* %.63, null
  br i1 %.64.not, label %entry.endif.endif.endif.endif.endif.endif, label %arg0.err, !prof !30

entry.endif.endif.endif.endif.endif.endif:        ; preds = %entry.endif.endif.endif.endif.endif
  %.68 = load i8*, i8** %.7, align 8
  %.71 = call i8* @PyNumber_Long(i8* %.68)
  %.72.not = icmp eq i8* %.71, null
  br i1 %.72.not, label %entry.endif.endif.endif.endif.endif.endif.endif, label %entry.endif.endif.endif.endif.endif.endif.if, !prof !10

entry.endif.endif.endif.endif.endif.endif.if:     ; preds = %entry.endif.endif.endif.endif.endif.endif
  %.74 = call i64 @PyLong_AsLongLong(i8* nonnull %.71)
  call void @Py_DecRef(i8* nonnull %.71)
  br label %entry.endif.endif.endif.endif.endif.endif.endif

entry.endif.endif.endif.endif.endif.endif.endif:  ; preds = %entry.endif.endif.endif.endif.endif.endif.if, %entry.endif.endif.endif.endif.endif.endif
  %.79 = call i8* @PyErr_Occurred()
  %.80.not = icmp eq i8* %.79, null
  br i1 %.80.not, label %entry.endif.endif.endif.endif.endif.endif.endif.endif, label %arg0.err, !prof !30

entry.endif.endif.endif.endif.endif.endif.endif.endif: ; preds = %entry.endif.endif.endif.endif.endif.endif.endif
  %.84 = load i8*, i8** %.8, align 8
  %.87 = call i8* @PyNumber_Long(i8* %.84)
  %.88.not = icmp eq i8* %.87, null
  br i1 %.88.not, label %entry.endif.endif.endif.e...endif, label %entry.endif.endif.endif.e...if, !prof !10

entry.endif.endif.endif.e...if:                   ; preds = %entry.endif.endif.endif.endif.endif.endif.endif.endif
  %.90 = call i64 @PyLong_AsLongLong(i8* nonnull %.87)
  call void @Py_DecRef(i8* nonnull %.87)
  br label %entry.endif.endif.endif.e...endif

entry.endif.endif.endif.e...endif:                ; preds = %entry.endif.endif.endif.e...if, %entry.endif.endif.endif.endif.endif.endif.endif.endif
  %.85.0 = phi i64 [ %.90, %entry.endif.endif.endif.e...if ], [ 0, %entry.endif.endif.endif.endif.endif.endif.endif.endif ]
  %.95 = call i8* @PyErr_Occurred()
  %.96.not = icmp eq i8* %.95, null
  br i1 %.96.not, label %entry.endif.endif.endif.e...endif.endif, label %arg0.err, !prof !30

entry.endif.endif.endif.e...endif.endif:          ; preds = %entry.endif.endif.endif.e...endif
  %.100 = load i8*, i8** %.9, align 8
  %.103 = call i8* @PyNumber_Long(i8* %.100)
  %.104.not = icmp eq i8* %.103, null
  br i1 %.104.not, label %entry.endif.endif.endif.e...endif.endif.endif, label %entry.endif.endif.endif.e...endif.endif.if, !prof !10

entry.endif.endif.endif.e...endif.endif.if:       ; preds = %entry.endif.endif.endif.e...endif.endif
  %.106 = call i64 @PyLong_AsLongLong(i8* nonnull %.103)
  call void @Py_DecRef(i8* nonnull %.103)
  br label %entry.endif.endif.endif.e...endif.endif.endif

entry.endif.endif.endif.e...endif.endif.endif:    ; preds = %entry.endif.endif.endif.e...endif.endif.if, %entry.endif.endif.endif.e...endif.endif
  %.111 = call i8* @PyErr_Occurred()
  %.112.not = icmp eq i8* %.111, null
  br i1 %.112.not, label %entry.endif.endif.endif.e...endif.endif.endif.endif, label %arg0.err, !prof !30

entry.endif.endif.endif.e...endif.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.endif.endif
  %.116 = load i8*, i8** %.10, align 8
  %.119 = call i8* @PyNumber_Long(i8* %.116)
  %.120.not = icmp eq i8* %.119, null
  br i1 %.120.not, label %entry.endif.endif.endif.e...endif.1, label %entry.endif.endif.endif.e...if.1, !prof !10

entry.endif.endif.endif.e...if.1:                 ; preds = %entry.endif.endif.endif.e...endif.endif.endif.endif
  %.122 = call i64 @PyLong_AsLongLong(i8* nonnull %.119)
  call void @Py_DecRef(i8* nonnull %.119)
  br label %entry.endif.endif.endif.e...endif.1

entry.endif.endif.endif.e...endif.1:              ; preds = %entry.endif.endif.endif.e...if.1, %entry.endif.endif.endif.e...endif.endif.endif.endif
  %.117.0 = phi i64 [ %.122, %entry.endif.endif.endif.e...if.1 ], [ 0, %entry.endif.endif.endif.e...endif.endif.endif.endif ]
  %.127 = call i8* @PyErr_Occurred()
  %.128.not = icmp eq i8* %.127, null
  br i1 %.128.not, label %entry.endif.endif.endif.e...endif.1.endif, label %arg0.err, !prof !30

entry.endif.endif.endif.e...endif.1.endif:        ; preds = %entry.endif.endif.endif.e...endif.1
  %.132 = load i8*, i8** %.11, align 8
  %.138 = call i64 @PyTuple_Size(i8* %.132)
  %.139.not = icmp eq i64 %.138, 6
  br i1 %.139.not, label %entry.endif.endif.endif.e...endif.1.endif.endif, label %entry.endif.endif.endif.e...endif.1.endif.if, !prof !30

entry.endif.endif.endif.e...endif.1.endif.if:     ; preds = %entry.endif.endif.endif.e...endif.1.endif
  call void (i8*, i8*, ...) @PyErr_Format(i8* nonnull @PyExc_ValueError, i8* getelementptr inbounds ([59 x i8], [59 x i8]* @".const.size mismatch for tuple, expected 6 element(s) but got %zd", i64 0, i64 0), i64 %.138)
  br label %entry.endif.endif.endif.e...endif.1.endif.endif

entry.endif.endif.endif.e...endif.1.endif.endif:  ; preds = %entry.endif.endif.endif.e...endif.1.endif.if, %entry.endif.endif.endif.e...endif.1.endif
  %16 = icmp eq i64 %.138, 6
  %17 = xor i1 %16, true
  %.145 = call i8* @PyTuple_GetItem(i8* %.132, i64 0)
  %.148 = call i8* @PyNumber_Long(i8* %.145)
  %.149.not = icmp eq i8* %.148, null
  br i1 %.149.not, label %entry.endif.endif.endif.e...endif.1.endif.endif.endif, label %entry.endif.endif.endif.e...endif.1.endif.endif.if, !prof !10

entry.endif.endif.endif.e...endif.1.endif.endif.if: ; preds = %entry.endif.endif.endif.e...endif.1.endif.endif
  %.151 = call i64 @PyLong_AsLongLong(i8* nonnull %.148)
  call void @Py_DecRef(i8* nonnull %.148)
  br label %entry.endif.endif.endif.e...endif.1.endif.endif.endif

entry.endif.endif.endif.e...endif.1.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.1.endif.endif.if, %entry.endif.endif.endif.e...endif.1.endif.endif
  %.146.0 = phi i64 [ %.151, %entry.endif.endif.endif.e...endif.1.endif.endif.if ], [ 0, %entry.endif.endif.endif.e...endif.1.endif.endif ]
  %.156 = call i8* @PyErr_Occurred()
  %.157.not = icmp eq i8* %.156, null
  br i1 %.157.not, label %entry.endif.endif.endif.e...endif.2, label %entry.endif.endif.endif.e...if.2, !prof !30

entry.endif.endif.endif.e...if.2:                 ; preds = %entry.endif.endif.endif.e...endif.1.endif.endif.endif
  br label %entry.endif.endif.endif.e...endif.2

entry.endif.endif.endif.e...endif.2:              ; preds = %entry.endif.endif.endif.e...if.2, %entry.endif.endif.endif.e...endif.1.endif.endif.endif
  %.133.1 = phi i1 [ true, %entry.endif.endif.endif.e...if.2 ], [ %17, %entry.endif.endif.endif.e...endif.1.endif.endif.endif ]
  %.161 = call i8* @PyTuple_GetItem(i8* %.132, i64 1)
  %.164 = call i8* @PyNumber_Long(i8* %.161)
  %.165.not = icmp eq i8* %.164, null
  br i1 %.165.not, label %entry.endif.endif.endif.e...endif.2.endif, label %entry.endif.endif.endif.e...endif.2.if, !prof !10

entry.endif.endif.endif.e...endif.2.if:           ; preds = %entry.endif.endif.endif.e...endif.2
  %.167 = call i64 @PyLong_AsLongLong(i8* nonnull %.164)
  call void @Py_DecRef(i8* nonnull %.164)
  br label %entry.endif.endif.endif.e...endif.2.endif

entry.endif.endif.endif.e...endif.2.endif:        ; preds = %entry.endif.endif.endif.e...endif.2.if, %entry.endif.endif.endif.e...endif.2
  %.162.0 = phi i64 [ %.167, %entry.endif.endif.endif.e...endif.2.if ], [ 0, %entry.endif.endif.endif.e...endif.2 ]
  %.172 = call i8* @PyErr_Occurred()
  %.173.not = icmp eq i8* %.172, null
  br i1 %.173.not, label %entry.endif.endif.endif.e...endif.2.endif.endif, label %entry.endif.endif.endif.e...endif.2.endif.if, !prof !30

entry.endif.endif.endif.e...endif.2.endif.if:     ; preds = %entry.endif.endif.endif.e...endif.2.endif
  br label %entry.endif.endif.endif.e...endif.2.endif.endif

entry.endif.endif.endif.e...endif.2.endif.endif:  ; preds = %entry.endif.endif.endif.e...endif.2.endif.if, %entry.endif.endif.endif.e...endif.2.endif
  %.133.2 = phi i1 [ true, %entry.endif.endif.endif.e...endif.2.endif.if ], [ %.133.1, %entry.endif.endif.endif.e...endif.2.endif ]
  %.177 = call i8* @PyTuple_GetItem(i8* %.132, i64 2)
  %.180 = call i8* @PyNumber_Long(i8* %.177)
  %.181.not = icmp eq i8* %.180, null
  br i1 %.181.not, label %entry.endif.endif.endif.e...endif.2.endif.endif.endif, label %entry.endif.endif.endif.e...endif.2.endif.endif.if, !prof !10

entry.endif.endif.endif.e...endif.2.endif.endif.if: ; preds = %entry.endif.endif.endif.e...endif.2.endif.endif
  %.183 = call i64 @PyLong_AsLongLong(i8* nonnull %.180)
  call void @Py_DecRef(i8* nonnull %.180)
  br label %entry.endif.endif.endif.e...endif.2.endif.endif.endif

entry.endif.endif.endif.e...endif.2.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.2.endif.endif.if, %entry.endif.endif.endif.e...endif.2.endif.endif
  %.178.0 = phi i64 [ %.183, %entry.endif.endif.endif.e...endif.2.endif.endif.if ], [ 0, %entry.endif.endif.endif.e...endif.2.endif.endif ]
  %.188 = call i8* @PyErr_Occurred()
  %.189.not = icmp eq i8* %.188, null
  br i1 %.189.not, label %entry.endif.endif.endif.e...endif.3, label %entry.endif.endif.endif.e...if.3, !prof !30

entry.endif.endif.endif.e...if.3:                 ; preds = %entry.endif.endif.endif.e...endif.2.endif.endif.endif
  br label %entry.endif.endif.endif.e...endif.3

entry.endif.endif.endif.e...endif.3:              ; preds = %entry.endif.endif.endif.e...if.3, %entry.endif.endif.endif.e...endif.2.endif.endif.endif
  %.133.3 = phi i1 [ true, %entry.endif.endif.endif.e...if.3 ], [ %.133.2, %entry.endif.endif.endif.e...endif.2.endif.endif.endif ]
  %.193 = call i8* @PyTuple_GetItem(i8* %.132, i64 3)
  %.196 = call i8* @PyNumber_Long(i8* %.193)
  %.197.not = icmp eq i8* %.196, null
  br i1 %.197.not, label %entry.endif.endif.endif.e...endif.3.endif, label %entry.endif.endif.endif.e...endif.3.if, !prof !10

entry.endif.endif.endif.e...endif.3.if:           ; preds = %entry.endif.endif.endif.e...endif.3
  %.199 = call i64 @PyLong_AsLongLong(i8* nonnull %.196)
  call void @Py_DecRef(i8* nonnull %.196)
  br label %entry.endif.endif.endif.e...endif.3.endif

entry.endif.endif.endif.e...endif.3.endif:        ; preds = %entry.endif.endif.endif.e...endif.3.if, %entry.endif.endif.endif.e...endif.3
  %.194.0 = phi i64 [ %.199, %entry.endif.endif.endif.e...endif.3.if ], [ 0, %entry.endif.endif.endif.e...endif.3 ]
  %.204 = call i8* @PyErr_Occurred()
  %.205.not = icmp eq i8* %.204, null
  br i1 %.205.not, label %entry.endif.endif.endif.e...endif.3.endif.endif, label %entry.endif.endif.endif.e...endif.3.endif.if, !prof !30

entry.endif.endif.endif.e...endif.3.endif.if:     ; preds = %entry.endif.endif.endif.e...endif.3.endif
  br label %entry.endif.endif.endif.e...endif.3.endif.endif

entry.endif.endif.endif.e...endif.3.endif.endif:  ; preds = %entry.endif.endif.endif.e...endif.3.endif.if, %entry.endif.endif.endif.e...endif.3.endif
  %.133.4 = phi i1 [ true, %entry.endif.endif.endif.e...endif.3.endif.if ], [ %.133.3, %entry.endif.endif.endif.e...endif.3.endif ]
  %.209 = call i8* @PyTuple_GetItem(i8* %.132, i64 4)
  %.212 = call i8* @PyNumber_Long(i8* %.209)
  %.213.not = icmp eq i8* %.212, null
  br i1 %.213.not, label %entry.endif.endif.endif.e...endif.3.endif.endif.endif, label %entry.endif.endif.endif.e...endif.3.endif.endif.if, !prof !10

entry.endif.endif.endif.e...endif.3.endif.endif.if: ; preds = %entry.endif.endif.endif.e...endif.3.endif.endif
  %.215 = call i64 @PyLong_AsLongLong(i8* nonnull %.212)
  call void @Py_DecRef(i8* nonnull %.212)
  br label %entry.endif.endif.endif.e...endif.3.endif.endif.endif

entry.endif.endif.endif.e...endif.3.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.3.endif.endif.if, %entry.endif.endif.endif.e...endif.3.endif.endif
  %.210.0 = phi i64 [ %.215, %entry.endif.endif.endif.e...endif.3.endif.endif.if ], [ 0, %entry.endif.endif.endif.e...endif.3.endif.endif ]
  %.220 = call i8* @PyErr_Occurred()
  %.221.not = icmp eq i8* %.220, null
  br i1 %.221.not, label %entry.endif.endif.endif.e...endif.4, label %entry.endif.endif.endif.e...if.4, !prof !30

entry.endif.endif.endif.e...if.4:                 ; preds = %entry.endif.endif.endif.e...endif.3.endif.endif.endif
  br label %entry.endif.endif.endif.e...endif.4

entry.endif.endif.endif.e...endif.4:              ; preds = %entry.endif.endif.endif.e...if.4, %entry.endif.endif.endif.e...endif.3.endif.endif.endif
  %.133.5 = phi i1 [ true, %entry.endif.endif.endif.e...if.4 ], [ %.133.4, %entry.endif.endif.endif.e...endif.3.endif.endif.endif ]
  %.225 = call i8* @PyTuple_GetItem(i8* %.132, i64 5)
  %.228 = call i8* @PyNumber_Long(i8* %.225)
  %.229.not = icmp eq i8* %.228, null
  br i1 %.229.not, label %entry.endif.endif.endif.e...endif.4.endif, label %entry.endif.endif.endif.e...endif.4.if, !prof !10

entry.endif.endif.endif.e...endif.4.if:           ; preds = %entry.endif.endif.endif.e...endif.4
  %.231 = call i64 @PyLong_AsLongLong(i8* nonnull %.228)
  call void @Py_DecRef(i8* nonnull %.228)
  br label %entry.endif.endif.endif.e...endif.4.endif

entry.endif.endif.endif.e...endif.4.endif:        ; preds = %entry.endif.endif.endif.e...endif.4.if, %entry.endif.endif.endif.e...endif.4
  %.226.0 = phi i64 [ %.231, %entry.endif.endif.endif.e...endif.4.if ], [ 0, %entry.endif.endif.endif.e...endif.4 ]
  %.236 = call i8* @PyErr_Occurred()
  %.237.not = icmp ne i8* %.236, null
  %brmerge = select i1 %.237.not, i1 true, i1 %.133.5
  br i1 %brmerge, label %arg0.err, label %entry.endif.endif.endif.e...endif.4.endif.endif.endif, !prof !31

entry.endif.endif.endif.e...endif.4.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.4.endif
  %.259 = load i8*, i8** %.12, align 8
  %.265 = call i64 @PyTuple_Size(i8* %.259)
  %.266.not = icmp eq i64 %.265, 6
  br i1 %.266.not, label %entry.endif.endif.endif.e...endif.5, label %entry.endif.endif.endif.e...if.5, !prof !30

entry.endif.endif.endif.e...if.5:                 ; preds = %entry.endif.endif.endif.e...endif.4.endif.endif.endif
  call void (i8*, i8*, ...) @PyErr_Format(i8* nonnull @PyExc_ValueError, i8* getelementptr inbounds ([59 x i8], [59 x i8]* @".const.size mismatch for tuple, expected 6 element(s) but got %zd", i64 0, i64 0), i64 %.265)
  br label %entry.endif.endif.endif.e...endif.5

entry.endif.endif.endif.e...endif.5:              ; preds = %entry.endif.endif.endif.e...if.5, %entry.endif.endif.endif.e...endif.4.endif.endif.endif
  %18 = icmp eq i64 %.265, 6
  %19 = xor i1 %18, true
  %.272 = call i8* @PyTuple_GetItem(i8* %.259, i64 0)
  %.275 = call i8* @PyNumber_Long(i8* %.272)
  %.276.not = icmp eq i8* %.275, null
  br i1 %.276.not, label %entry.endif.endif.endif.e...endif.5.endif, label %entry.endif.endif.endif.e...endif.5.if, !prof !10

entry.endif.endif.endif.e...endif.5.if:           ; preds = %entry.endif.endif.endif.e...endif.5
  %.278 = call i64 @PyLong_AsLongLong(i8* nonnull %.275)
  call void @Py_DecRef(i8* nonnull %.275)
  br label %entry.endif.endif.endif.e...endif.5.endif

entry.endif.endif.endif.e...endif.5.endif:        ; preds = %entry.endif.endif.endif.e...endif.5.if, %entry.endif.endif.endif.e...endif.5
  %.273.0 = phi i64 [ %.278, %entry.endif.endif.endif.e...endif.5.if ], [ 0, %entry.endif.endif.endif.e...endif.5 ]
  %.283 = call i8* @PyErr_Occurred()
  %.284.not = icmp eq i8* %.283, null
  br i1 %.284.not, label %entry.endif.endif.endif.e...endif.5.endif.endif, label %entry.endif.endif.endif.e...endif.5.endif.if, !prof !30

entry.endif.endif.endif.e...endif.5.endif.if:     ; preds = %entry.endif.endif.endif.e...endif.5.endif
  br label %entry.endif.endif.endif.e...endif.5.endif.endif

entry.endif.endif.endif.e...endif.5.endif.endif:  ; preds = %entry.endif.endif.endif.e...endif.5.endif.if, %entry.endif.endif.endif.e...endif.5.endif
  %.260.1 = phi i1 [ true, %entry.endif.endif.endif.e...endif.5.endif.if ], [ %19, %entry.endif.endif.endif.e...endif.5.endif ]
  %.288 = call i8* @PyTuple_GetItem(i8* %.259, i64 1)
  %.291 = call i8* @PyNumber_Long(i8* %.288)
  %.292.not = icmp eq i8* %.291, null
  br i1 %.292.not, label %entry.endif.endif.endif.e...endif.5.endif.endif.endif, label %entry.endif.endif.endif.e...endif.5.endif.endif.if, !prof !10

entry.endif.endif.endif.e...endif.5.endif.endif.if: ; preds = %entry.endif.endif.endif.e...endif.5.endif.endif
  %.294 = call i64 @PyLong_AsLongLong(i8* nonnull %.291)
  call void @Py_DecRef(i8* nonnull %.291)
  br label %entry.endif.endif.endif.e...endif.5.endif.endif.endif

entry.endif.endif.endif.e...endif.5.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.5.endif.endif.if, %entry.endif.endif.endif.e...endif.5.endif.endif
  %.289.0 = phi i64 [ %.294, %entry.endif.endif.endif.e...endif.5.endif.endif.if ], [ 0, %entry.endif.endif.endif.e...endif.5.endif.endif ]
  %.299 = call i8* @PyErr_Occurred()
  %.300.not = icmp eq i8* %.299, null
  br i1 %.300.not, label %entry.endif.endif.endif.e...endif.6, label %entry.endif.endif.endif.e...if.6, !prof !30

entry.endif.endif.endif.e...if.6:                 ; preds = %entry.endif.endif.endif.e...endif.5.endif.endif.endif
  br label %entry.endif.endif.endif.e...endif.6

entry.endif.endif.endif.e...endif.6:              ; preds = %entry.endif.endif.endif.e...if.6, %entry.endif.endif.endif.e...endif.5.endif.endif.endif
  %.260.2 = phi i1 [ true, %entry.endif.endif.endif.e...if.6 ], [ %.260.1, %entry.endif.endif.endif.e...endif.5.endif.endif.endif ]
  %.304 = call i8* @PyTuple_GetItem(i8* %.259, i64 2)
  %.307 = call i8* @PyNumber_Long(i8* %.304)
  %.308.not = icmp eq i8* %.307, null
  br i1 %.308.not, label %entry.endif.endif.endif.e...endif.6.endif, label %entry.endif.endif.endif.e...endif.6.if, !prof !10

entry.endif.endif.endif.e...endif.6.if:           ; preds = %entry.endif.endif.endif.e...endif.6
  %.310 = call i64 @PyLong_AsLongLong(i8* nonnull %.307)
  call void @Py_DecRef(i8* nonnull %.307)
  br label %entry.endif.endif.endif.e...endif.6.endif

entry.endif.endif.endif.e...endif.6.endif:        ; preds = %entry.endif.endif.endif.e...endif.6.if, %entry.endif.endif.endif.e...endif.6
  %.305.0 = phi i64 [ %.310, %entry.endif.endif.endif.e...endif.6.if ], [ 0, %entry.endif.endif.endif.e...endif.6 ]
  %.315 = call i8* @PyErr_Occurred()
  %.316.not = icmp eq i8* %.315, null
  br i1 %.316.not, label %entry.endif.endif.endif.e...endif.6.endif.endif, label %entry.endif.endif.endif.e...endif.6.endif.if, !prof !30

entry.endif.endif.endif.e...endif.6.endif.if:     ; preds = %entry.endif.endif.endif.e...endif.6.endif
  br label %entry.endif.endif.endif.e...endif.6.endif.endif

entry.endif.endif.endif.e...endif.6.endif.endif:  ; preds = %entry.endif.endif.endif.e...endif.6.endif.if, %entry.endif.endif.endif.e...endif.6.endif
  %.260.3 = phi i1 [ true, %entry.endif.endif.endif.e...endif.6.endif.if ], [ %.260.2, %entry.endif.endif.endif.e...endif.6.endif ]
  %.320 = call i8* @PyTuple_GetItem(i8* %.259, i64 3)
  %.323 = call i8* @PyNumber_Long(i8* %.320)
  %.324.not = icmp eq i8* %.323, null
  br i1 %.324.not, label %entry.endif.endif.endif.e...endif.6.endif.endif.endif, label %entry.endif.endif.endif.e...endif.6.endif.endif.if, !prof !10

entry.endif.endif.endif.e...endif.6.endif.endif.if: ; preds = %entry.endif.endif.endif.e...endif.6.endif.endif
  %.326 = call i64 @PyLong_AsLongLong(i8* nonnull %.323)
  call void @Py_DecRef(i8* nonnull %.323)
  br label %entry.endif.endif.endif.e...endif.6.endif.endif.endif

entry.endif.endif.endif.e...endif.6.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.6.endif.endif.if, %entry.endif.endif.endif.e...endif.6.endif.endif
  %.321.0 = phi i64 [ %.326, %entry.endif.endif.endif.e...endif.6.endif.endif.if ], [ 0, %entry.endif.endif.endif.e...endif.6.endif.endif ]
  %.331 = call i8* @PyErr_Occurred()
  %.332.not = icmp eq i8* %.331, null
  br i1 %.332.not, label %entry.endif.endif.endif.e...endif.7, label %entry.endif.endif.endif.e...if.7, !prof !30

entry.endif.endif.endif.e...if.7:                 ; preds = %entry.endif.endif.endif.e...endif.6.endif.endif.endif
  br label %entry.endif.endif.endif.e...endif.7

entry.endif.endif.endif.e...endif.7:              ; preds = %entry.endif.endif.endif.e...if.7, %entry.endif.endif.endif.e...endif.6.endif.endif.endif
  %.260.4 = phi i1 [ true, %entry.endif.endif.endif.e...if.7 ], [ %.260.3, %entry.endif.endif.endif.e...endif.6.endif.endif.endif ]
  %.336 = call i8* @PyTuple_GetItem(i8* %.259, i64 4)
  %.339 = call i8* @PyNumber_Long(i8* %.336)
  %.340.not = icmp eq i8* %.339, null
  br i1 %.340.not, label %entry.endif.endif.endif.e...endif.7.endif, label %entry.endif.endif.endif.e...endif.7.if, !prof !10

entry.endif.endif.endif.e...endif.7.if:           ; preds = %entry.endif.endif.endif.e...endif.7
  %.342 = call i64 @PyLong_AsLongLong(i8* nonnull %.339)
  call void @Py_DecRef(i8* nonnull %.339)
  br label %entry.endif.endif.endif.e...endif.7.endif

entry.endif.endif.endif.e...endif.7.endif:        ; preds = %entry.endif.endif.endif.e...endif.7.if, %entry.endif.endif.endif.e...endif.7
  %.337.0 = phi i64 [ %.342, %entry.endif.endif.endif.e...endif.7.if ], [ 0, %entry.endif.endif.endif.e...endif.7 ]
  %.347 = call i8* @PyErr_Occurred()
  %.348.not = icmp eq i8* %.347, null
  br i1 %.348.not, label %entry.endif.endif.endif.e...endif.7.endif.endif, label %entry.endif.endif.endif.e...endif.7.endif.if, !prof !30

entry.endif.endif.endif.e...endif.7.endif.if:     ; preds = %entry.endif.endif.endif.e...endif.7.endif
  br label %entry.endif.endif.endif.e...endif.7.endif.endif

entry.endif.endif.endif.e...endif.7.endif.endif:  ; preds = %entry.endif.endif.endif.e...endif.7.endif.if, %entry.endif.endif.endif.e...endif.7.endif
  %.260.5 = phi i1 [ true, %entry.endif.endif.endif.e...endif.7.endif.if ], [ %.260.4, %entry.endif.endif.endif.e...endif.7.endif ]
  %.352 = call i8* @PyTuple_GetItem(i8* %.259, i64 5)
  %.355 = call i8* @PyNumber_Long(i8* %.352)
  %.356.not = icmp eq i8* %.355, null
  br i1 %.356.not, label %entry.endif.endif.endif.e...endif.7.endif.endif.endif, label %entry.endif.endif.endif.e...endif.7.endif.endif.if, !prof !10

entry.endif.endif.endif.e...endif.7.endif.endif.if: ; preds = %entry.endif.endif.endif.e...endif.7.endif.endif
  %.358 = call i64 @PyLong_AsLongLong(i8* nonnull %.355)
  call void @Py_DecRef(i8* nonnull %.355)
  br label %entry.endif.endif.endif.e...endif.7.endif.endif.endif

entry.endif.endif.endif.e...endif.7.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.7.endif.endif.if, %entry.endif.endif.endif.e...endif.7.endif.endif
  %.353.0 = phi i64 [ %.358, %entry.endif.endif.endif.e...endif.7.endif.endif.if ], [ 0, %entry.endif.endif.endif.e...endif.7.endif.endif ]
  %.363 = call i8* @PyErr_Occurred()
  %.364.not = icmp ne i8* %.363, null
  %brmerge3 = select i1 %.364.not, i1 true, i1 %.260.5
  br i1 %brmerge3, label %arg0.err, label %entry.endif.endif.endif.e...endif.8.endif, !prof !31

entry.endif.endif.endif.e...endif.8.endif:        ; preds = %entry.endif.endif.endif.e...endif.7.endif.endif.endif
  %20 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8**
  %21 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  call void @llvm.memset.p0i8.i64(i8* noundef nonnull align 8 dereferenceable(136) %21, i8 0, i64 136, i1 false)
  %.406 = call i32 @_ZN9froSTspin10misc_tools11numba_tools23numba_transpose_reshapeB3v50B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE5ArrayIdLi2E1C8readonly7alignedExxxxx8UniTupleIxLi6EE8UniTupleIxLi6EE({ i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* nonnull %.386, { i8*, i32, i8*, i8*, i32 }** nonnull %excinfo, i8* %.43.fca.0.load, i8* undef, i64 undef, i64 8, double* %.43.fca.4.load, i64 %.43.fca.5.0.load, i64 %.43.fca.5.1.load, i64 %.43.fca.6.0.load, i64 %.43.fca.6.1.load, i64 %.53.0, i64 undef, i64 %.85.0, i64 undef, i64 %.117.0, i64 %.146.0, i64 %.162.0, i64 %.178.0, i64 %.194.0, i64 %.210.0, i64 %.226.0, i64 %.273.0, i64 %.289.0, i64 %.305.0, i64 %.321.0, i64 %.337.0, i64 %.353.0) #1
  %.407 = load { i8*, i32, i8*, i8*, i32 }*, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8
  %.414 = icmp sgt i32 %.406, 0
  %.415 = select i1 %.414, { i8*, i32, i8*, i8*, i32 }* %.407, { i8*, i32, i8*, i8*, i32 }* undef
  %.416.fca.0.load = load i8*, i8** %20, align 8
  %22 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr18 = getelementptr inbounds i8, i8* %22, i64 8
  %23 = bitcast i8* %sunkaddr18 to i8**
  %.416.fca.1.load = load i8*, i8** %23, align 8
  %24 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr19 = getelementptr inbounds i8, i8* %24, i64 16
  %25 = bitcast i8* %sunkaddr19 to i64*
  %.416.fca.2.load = load i64, i64* %25, align 8
  %26 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr20 = getelementptr inbounds i8, i8* %26, i64 24
  %27 = bitcast i8* %sunkaddr20 to i64*
  %.416.fca.3.load = load i64, i64* %27, align 8
  %28 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr21 = getelementptr inbounds i8, i8* %28, i64 32
  %29 = bitcast i8* %sunkaddr21 to double**
  %.416.fca.4.load = load double*, double** %29, align 8
  %30 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr22 = getelementptr inbounds i8, i8* %30, i64 40
  %31 = bitcast i8* %sunkaddr22 to i64*
  %.416.fca.5.0.load = load i64, i64* %31, align 8
  %32 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr23 = getelementptr inbounds i8, i8* %32, i64 48
  %33 = bitcast i8* %sunkaddr23 to i64*
  %.416.fca.5.1.load = load i64, i64* %33, align 8
  %34 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr24 = getelementptr inbounds i8, i8* %34, i64 56
  %35 = bitcast i8* %sunkaddr24 to i64*
  %.416.fca.5.2.load = load i64, i64* %35, align 8
  %36 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr25 = getelementptr inbounds i8, i8* %36, i64 64
  %37 = bitcast i8* %sunkaddr25 to i64*
  %.416.fca.5.3.load = load i64, i64* %37, align 8
  %38 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr26 = getelementptr inbounds i8, i8* %38, i64 72
  %39 = bitcast i8* %sunkaddr26 to i64*
  %.416.fca.5.4.load = load i64, i64* %39, align 8
  %40 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr27 = getelementptr inbounds i8, i8* %40, i64 80
  %41 = bitcast i8* %sunkaddr27 to i64*
  %.416.fca.5.5.load = load i64, i64* %41, align 8
  %42 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr28 = getelementptr inbounds i8, i8* %42, i64 88
  %43 = bitcast i8* %sunkaddr28 to i64*
  %.416.fca.6.0.load = load i64, i64* %43, align 8
  %44 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr29 = getelementptr inbounds i8, i8* %44, i64 96
  %45 = bitcast i8* %sunkaddr29 to i64*
  %.416.fca.6.1.load = load i64, i64* %45, align 8
  %46 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr30 = getelementptr inbounds i8, i8* %46, i64 104
  %47 = bitcast i8* %sunkaddr30 to i64*
  %.416.fca.6.2.load = load i64, i64* %47, align 8
  %48 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr31 = getelementptr inbounds i8, i8* %48, i64 112
  %49 = bitcast i8* %sunkaddr31 to i64*
  %.416.fca.6.3.load = load i64, i64* %49, align 8
  %50 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr32 = getelementptr inbounds i8, i8* %50, i64 120
  %51 = bitcast i8* %sunkaddr32 to i64*
  %.416.fca.6.4.load = load i64, i64* %51, align 8
  %52 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.386 to i8*
  %sunkaddr33 = getelementptr inbounds i8, i8* %52, i64 128
  %53 = bitcast i8* %sunkaddr33 to i64*
  %.416.fca.6.5.load = load i64, i64* %53, align 8
  call void @NRT_decref(i8* %.43.fca.0.load)
  switch i32 %.406, label %entry.endif.endif.endif.e...endif.8.endif.endif [
    i32 -2, label %entry.endif.endif.endif.e...endif.8.endif.if.if
    i32 0, label %entry.endif.endif.endif.e...endif.8.endif.if.endif
  ]

entry.endif.endif.endif.e...endif.8.endif.endif:  ; preds = %entry.endif.endif.endif.e...endif.8.endif
  %54 = icmp sgt i32 %.406, 0
  br i1 %54, label %entry.endif.endif.endif.e...endif.8.endif.endif.if, label %entry.endif.endif.endif.e...endif.8.endif.endif.endif

entry.endif.endif.endif.e...endif.8.endif.if.if:  ; preds = %entry.endif.endif.endif.e...endif.8.endif
  call void @Py_IncRef(i8* nonnull @_Py_NoneStruct)
  br label %common.ret

entry.endif.endif.endif.e...endif.8.endif.if.endif: ; preds = %entry.endif.endif.endif.e...endif.8.endif
  %sunkaddr34 = getelementptr i8, i8* %.18, i64 24
  %55 = bitcast i8* %sunkaddr34 to i8**
  %.474 = load i8*, i8** %55, align 8
  %.478.not = icmp eq i8* %.474, null
  br i1 %.478.not, label %entry.endif.endif.endif.e...endif.8.endif.if.endif.else, label %entry.endif.endif.endif.e...endif.8.endif.if.endif.if

entry.endif.endif.endif.e...endif.8.endif.if.endif.if: ; preds = %entry.endif.endif.endif.e...endif.8.endif.if.endif
  %.480 = call i8* @PyList_GetItem(i8* nonnull %.474, i64 0)
  br label %entry.endif.endif.endif.e...endif.8.endif.if.endif.endif

entry.endif.endif.endif.e...endif.8.endif.if.endif.else: ; preds = %entry.endif.endif.endif.e...endif.8.endif.if.endif
  call void @PyErr_SetString(i8* nonnull @PyExc_RuntimeError, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @".const.`env.consts` is NULL in `read_const`", i64 0, i64 0))
  br label %entry.endif.endif.endif.e...endif.8.endif.if.endif.endif

entry.endif.endif.endif.e...endif.8.endif.if.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.8.endif.if.endif.else, %entry.endif.endif.endif.e...endif.8.endif.if.endif.if
  %.475.0 = phi i8* [ %.480, %entry.endif.endif.endif.e...endif.8.endif.if.endif.if ], [ null, %entry.endif.endif.endif.e...endif.8.endif.if.endif.else ]
  %56 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8**
  %.492 = call i8* @numba_unpickle(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.const.pickledata.139741320154272, i64 0, i64 0), i32 32, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.const.pickledata.139741320154272.sha1, i64 0, i64 0))
  store i8* %.416.fca.0.load, i8** %56, align 8
  %57 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr35 = getelementptr inbounds i8, i8* %57, i64 8
  %58 = bitcast i8* %sunkaddr35 to i8**
  store i8* %.416.fca.1.load, i8** %58, align 8
  %59 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr36 = getelementptr inbounds i8, i8* %59, i64 16
  %60 = bitcast i8* %sunkaddr36 to i64*
  store i64 %.416.fca.2.load, i64* %60, align 8
  %61 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr37 = getelementptr inbounds i8, i8* %61, i64 24
  %62 = bitcast i8* %sunkaddr37 to i64*
  store i64 %.416.fca.3.load, i64* %62, align 8
  %63 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr38 = getelementptr inbounds i8, i8* %63, i64 32
  %64 = bitcast i8* %sunkaddr38 to double**
  store double* %.416.fca.4.load, double** %64, align 8
  %65 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr39 = getelementptr inbounds i8, i8* %65, i64 40
  %66 = bitcast i8* %sunkaddr39 to i64*
  store i64 %.416.fca.5.0.load, i64* %66, align 8
  %67 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr40 = getelementptr inbounds i8, i8* %67, i64 48
  %68 = bitcast i8* %sunkaddr40 to i64*
  store i64 %.416.fca.5.1.load, i64* %68, align 8
  %69 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr41 = getelementptr inbounds i8, i8* %69, i64 56
  %70 = bitcast i8* %sunkaddr41 to i64*
  store i64 %.416.fca.5.2.load, i64* %70, align 8
  %71 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr42 = getelementptr inbounds i8, i8* %71, i64 64
  %72 = bitcast i8* %sunkaddr42 to i64*
  store i64 %.416.fca.5.3.load, i64* %72, align 8
  %73 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr43 = getelementptr inbounds i8, i8* %73, i64 72
  %74 = bitcast i8* %sunkaddr43 to i64*
  store i64 %.416.fca.5.4.load, i64* %74, align 8
  %75 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr44 = getelementptr inbounds i8, i8* %75, i64 80
  %76 = bitcast i8* %sunkaddr44 to i64*
  store i64 %.416.fca.5.5.load, i64* %76, align 8
  %77 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr45 = getelementptr inbounds i8, i8* %77, i64 88
  %78 = bitcast i8* %sunkaddr45 to i64*
  store i64 %.416.fca.6.0.load, i64* %78, align 8
  %79 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr46 = getelementptr inbounds i8, i8* %79, i64 96
  %80 = bitcast i8* %sunkaddr46 to i64*
  store i64 %.416.fca.6.1.load, i64* %80, align 8
  %81 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr47 = getelementptr inbounds i8, i8* %81, i64 104
  %82 = bitcast i8* %sunkaddr47 to i64*
  store i64 %.416.fca.6.2.load, i64* %82, align 8
  %83 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr48 = getelementptr inbounds i8, i8* %83, i64 112
  %84 = bitcast i8* %sunkaddr48 to i64*
  store i64 %.416.fca.6.3.load, i64* %84, align 8
  %85 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr49 = getelementptr inbounds i8, i8* %85, i64 120
  %86 = bitcast i8* %sunkaddr49 to i64*
  store i64 %.416.fca.6.4.load, i64* %86, align 8
  %87 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %sunkaddr50 = getelementptr inbounds i8, i8* %87, i64 128
  %88 = bitcast i8* %sunkaddr50 to i64*
  store i64 %.416.fca.6.5.load, i64* %88, align 8
  %.496 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.493 to i8*
  %.497 = call i8* @NRT_adapt_ndarray_to_python_acqref(i8* nonnull %.496, i8* %.492, i32 6, i32 0, i8* %.475.0)
  call void @NRT_decref(i8* %.416.fca.0.load)
  br label %common.ret

entry.endif.endif.endif.e...endif.8.endif.endif.if: ; preds = %entry.endif.endif.endif.e...endif.8.endif.endif
  call void @PyErr_Clear()
  %.515 = load { i8*, i32, i8*, i8*, i32 }, { i8*, i32, i8*, i8*, i32 }* %.415, align 8
  %.516 = extractvalue { i8*, i32, i8*, i8*, i32 } %.515, 4
  %.517 = icmp sgt i32 %.516, 0
  %.520 = extractvalue { i8*, i32, i8*, i8*, i32 } %.515, 0
  %.522 = extractvalue { i8*, i32, i8*, i8*, i32 } %.515, 1
  br i1 %.517, label %entry.endif.endif.endif.e...endif.8.endif.endif.if.if, label %entry.endif.endif.endif.e...endif.8.endif.endif.if.else

entry.endif.endif.endif.e...endif.8.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.8.endif.endif
  switch i32 %.406, label %entry.endif.endif.endif.e...endif.11.endif [
    i32 -3, label %entry.endif.endif.endif.e...if.11
    i32 -1, label %common.ret
  ]

entry.endif.endif.endif.e...endif.8.endif.endif.if.if: ; preds = %entry.endif.endif.endif.e...endif.8.endif.endif.if
  %.523 = sext i32 %.522 to i64
  %.524 = call i8* @PyBytes_FromStringAndSize(i8* %.520, i64 %.523)
  %.525 = load { i8*, i32, i8*, i8*, i32 }, { i8*, i32, i8*, i8*, i32 }* %.415, align 8
  %.526 = extractvalue { i8*, i32, i8*, i8*, i32 } %.525, 2
  %.528 = extractvalue { i8*, i32, i8*, i8*, i32 } %.525, 3
  %.529 = bitcast i8* %.528 to i8* (i8*)*
  %.530 = call i8* %.529(i8* %.526)
  %.531 = icmp eq i8* %.530, null
  br i1 %.531, label %entry.endif.endif.endif.e...if.9, label %entry.endif.endif.endif.e...endif.9, !prof !10

entry.endif.endif.endif.e...endif.8.endif.endif.if.else: ; preds = %entry.endif.endif.endif.e...endif.8.endif.endif.if
  %.544 = extractvalue { i8*, i32, i8*, i8*, i32 } %.515, 2
  %.545 = call i8* @numba_unpickle(i8* %.520, i32 %.522, i8* %.544)
  br label %entry.endif.endif.endif.e...endif.8.endif.endif.if.endif

entry.endif.endif.endif.e...endif.8.endif.endif.if.endif: ; preds = %entry.endif.endif.endif.e...endif.9, %entry.endif.endif.endif.e...endif.8.endif.endif.if.else
  %.547 = phi i8* [ %.535, %entry.endif.endif.endif.e...endif.9 ], [ %.545, %entry.endif.endif.endif.e...endif.8.endif.endif.if.else ]
  %.548.not = icmp eq i8* %.547, null
  br i1 %.548.not, label %common.ret, label %entry.endif.endif.endif.e...if.10, !prof !10

entry.endif.endif.endif.e...if.9:                 ; preds = %entry.endif.endif.endif.e...endif.8.endif.endif.if.if
  call void @PyErr_SetString(i8* nonnull @PyExc_RuntimeError, i8* getelementptr inbounds ([61 x i8], [61 x i8]* @".const.Error creating Python tuple from runtime exception arguments", i64 0, i64 0))
  br label %common.ret

entry.endif.endif.endif.e...endif.9:              ; preds = %entry.endif.endif.endif.e...endif.8.endif.endif.if.if
  %.535 = call i8* @numba_runtime_build_excinfo_struct(i8* %.524, i8* nonnull %.530)
  %.536 = bitcast { i8*, i32, i8*, i8*, i32 }* %.415 to i8*
  call void @NRT_Free(i8* nonnull %.536)
  br label %entry.endif.endif.endif.e...endif.8.endif.endif.if.endif

entry.endif.endif.endif.e...if.10:                ; preds = %entry.endif.endif.endif.e...endif.8.endif.endif.if.endif
  call void @numba_do_raise(i8* nonnull %.547)
  br label %common.ret

entry.endif.endif.endif.e...if.11:                ; preds = %entry.endif.endif.endif.e...endif.8.endif.endif.endif
  call void @PyErr_SetNone(i8* nonnull @PyExc_StopIteration)
  br label %common.ret

entry.endif.endif.endif.e...endif.11.endif:       ; preds = %entry.endif.endif.endif.e...endif.8.endif.endif.endif
  call void @PyErr_SetString(i8* nonnull @PyExc_SystemError, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @".const.unknown error when calling native function", i64 0, i64 0))
  br label %common.ret
}

declare i32 @PyArg_UnpackTuple(i8*, i8*, i64, i64, ...) local_unnamed_addr

declare void @PyErr_SetString(i8*, i8*) local_unnamed_addr

declare i32 @NRT_adapt_ndarray_from_python(i8* nocapture, i8* nocapture) local_unnamed_addr

declare i8* @PyNumber_Long(i8*) local_unnamed_addr

declare i64 @PyLong_AsLongLong(i8*) local_unnamed_addr

declare void @Py_DecRef(i8*) local_unnamed_addr

declare i8* @PyErr_Occurred() local_unnamed_addr

declare i64 @PyTuple_Size(i8*) local_unnamed_addr

declare void @PyErr_Format(i8*, i8*, ...) local_unnamed_addr

declare i8* @PyTuple_GetItem(i8*, i64) local_unnamed_addr

declare void @Py_IncRef(i8*) local_unnamed_addr

declare i8* @PyList_GetItem(i8*, i64) local_unnamed_addr

declare i8* @numba_unpickle(i8*, i32, i8*) local_unnamed_addr

declare i8* @NRT_adapt_ndarray_to_python_acqref(i8* nocapture, i8*, i32, i32, i8*) local_unnamed_addr

declare void @PyErr_Clear() local_unnamed_addr

declare i8* @PyBytes_FromStringAndSize(i8*, i64) local_unnamed_addr

declare i8* @numba_runtime_build_excinfo_struct(i8*, i8*) local_unnamed_addr

declare void @NRT_Free(i8*) local_unnamed_addr

declare void @numba_do_raise(i8*) local_unnamed_addr

declare void @PyErr_SetNone(i8*) local_unnamed_addr

define { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] } @cfunc._ZN9froSTspin10misc_tools11numba_tools23numba_transpose_reshapeB3v50B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE5ArrayIdLi2E1C8readonly7alignedExxxxx8UniTupleIxLi6EE8UniTupleIxLi6EE({ i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] } %.1, i64 %.2, i64 %.3, i64 %.4, i64 %.5, i64 %.6, [6 x i64] %.7, [6 x i64] %.8) local_unnamed_addr {
entry:
  %.10 = alloca { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, align 8
  %.fca.0.gep1 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10 to i8**
  %.fca.1.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 1
  %.fca.2.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 2
  %.fca.3.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 3
  %.fca.4.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 4
  %.fca.5.0.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 5, i64 0
  %.fca.5.1.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 5, i64 1
  %.fca.5.2.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 5, i64 2
  %.fca.5.3.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 5, i64 3
  %.fca.5.4.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 5, i64 4
  %.fca.5.5.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 5, i64 5
  %.fca.6.0.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 6, i64 0
  %.fca.6.1.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 6, i64 1
  %.fca.6.2.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 6, i64 2
  %.fca.6.3.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 6, i64 3
  %.fca.6.4.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 6, i64 4
  %.fca.6.5.gep = getelementptr inbounds { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }, { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10, i64 0, i32 6, i64 5
  %excinfo = alloca { i8*, i32, i8*, i8*, i32 }*, align 8
  %0 = bitcast { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* %.10 to i8*
  call void @llvm.memset.p0i8.i64(i8* noundef nonnull align 8 dereferenceable(136) %0, i8 0, i64 136, i1 false)
  store { i8*, i32, i8*, i8*, i32 }* null, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8
  %extracted.meminfo = extractvalue { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] } %.1, 0
  %extracted.itemsize = extractvalue { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] } %.1, 3
  %extracted.data = extractvalue { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] } %.1, 4
  %extracted.shape = extractvalue { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] } %.1, 5
  %.14 = extractvalue [2 x i64] %extracted.shape, 0
  %.15 = extractvalue [2 x i64] %extracted.shape, 1
  %extracted.strides = extractvalue { i8*, i8*, i64, i64, double*, [2 x i64], [2 x i64] } %.1, 6
  %.16 = extractvalue [2 x i64] %extracted.strides, 0
  %.17 = extractvalue [2 x i64] %extracted.strides, 1
  %.18 = extractvalue [6 x i64] %.7, 0
  %.19 = extractvalue [6 x i64] %.7, 1
  %.20 = extractvalue [6 x i64] %.7, 2
  %.21 = extractvalue [6 x i64] %.7, 3
  %.22 = extractvalue [6 x i64] %.7, 4
  %.23 = extractvalue [6 x i64] %.7, 5
  %.24 = extractvalue [6 x i64] %.8, 0
  %.25 = extractvalue [6 x i64] %.8, 1
  %.26 = extractvalue [6 x i64] %.8, 2
  %.27 = extractvalue [6 x i64] %.8, 3
  %.28 = extractvalue [6 x i64] %.8, 4
  %.29 = extractvalue [6 x i64] %.8, 5
  %.30 = call i32 @_ZN9froSTspin10misc_tools11numba_tools23numba_transpose_reshapeB3v50B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE5ArrayIdLi2E1C8readonly7alignedExxxxx8UniTupleIxLi6EE8UniTupleIxLi6EE({ i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] }* nonnull %.10, { i8*, i32, i8*, i8*, i32 }** nonnull %excinfo, i8* %extracted.meminfo, i8* undef, i64 undef, i64 %extracted.itemsize, double* %extracted.data, i64 %.14, i64 %.15, i64 %.16, i64 %.17, i64 %.2, i64 undef, i64 %.4, i64 undef, i64 %.6, i64 %.18, i64 %.19, i64 %.20, i64 %.21, i64 %.22, i64 %.23, i64 %.24, i64 %.25, i64 %.26, i64 %.27, i64 %.28, i64 %.29) #1
  %.31 = load { i8*, i32, i8*, i8*, i32 }*, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8
  %.38 = icmp sgt i32 %.30, 0
  %.39 = select i1 %.38, { i8*, i32, i8*, i8*, i32 }* %.31, { i8*, i32, i8*, i8*, i32 }* undef
  %.40.fca.0.load = load i8*, i8** %.fca.0.gep1, align 8
  %.40.fca.1.load = load i8*, i8** %.fca.1.gep, align 8
  %.40.fca.2.load = load i64, i64* %.fca.2.gep, align 8
  %.40.fca.3.load = load i64, i64* %.fca.3.gep, align 8
  %.40.fca.4.load = load double*, double** %.fca.4.gep, align 8
  %.40.fca.5.0.load = load i64, i64* %.fca.5.0.gep, align 8
  %.40.fca.5.1.load = load i64, i64* %.fca.5.1.gep, align 8
  %.40.fca.5.2.load = load i64, i64* %.fca.5.2.gep, align 8
  %.40.fca.5.3.load = load i64, i64* %.fca.5.3.gep, align 8
  %.40.fca.5.4.load = load i64, i64* %.fca.5.4.gep, align 8
  %.40.fca.5.5.load = load i64, i64* %.fca.5.5.gep, align 8
  %.40.fca.6.0.load = load i64, i64* %.fca.6.0.gep, align 8
  %.40.fca.6.1.load = load i64, i64* %.fca.6.1.gep, align 8
  %.40.fca.6.2.load = load i64, i64* %.fca.6.2.gep, align 8
  %.40.fca.6.3.load = load i64, i64* %.fca.6.3.gep, align 8
  %.40.fca.6.4.load = load i64, i64* %.fca.6.4.gep, align 8
  %.40.fca.6.5.load = load i64, i64* %.fca.6.5.gep, align 8
  %1 = insertvalue [6 x i64] poison, i64 %.40.fca.5.0.load, 0
  %2 = insertvalue [6 x i64] %1, i64 %.40.fca.5.1.load, 1
  %3 = insertvalue [6 x i64] %2, i64 %.40.fca.5.2.load, 2
  %4 = insertvalue [6 x i64] %3, i64 %.40.fca.5.3.load, 3
  %5 = insertvalue [6 x i64] %4, i64 %.40.fca.5.4.load, 4
  %.46 = insertvalue [6 x i64] %5, i64 %.40.fca.5.5.load, 5
  %6 = insertvalue [6 x i64] poison, i64 %.40.fca.6.0.load, 0
  %7 = insertvalue [6 x i64] %6, i64 %.40.fca.6.1.load, 1
  %8 = insertvalue [6 x i64] %7, i64 %.40.fca.6.2.load, 2
  %9 = insertvalue [6 x i64] %8, i64 %.40.fca.6.3.load, 3
  %10 = insertvalue [6 x i64] %9, i64 %.40.fca.6.4.load, 4
  %.47 = insertvalue [6 x i64] %10, i64 %.40.fca.6.5.load, 5
  %inserted.meminfo = insertvalue { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] } undef, i8* %.40.fca.0.load, 0
  %inserted.parent = insertvalue { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] } %inserted.meminfo, i8* %.40.fca.1.load, 1
  %inserted.nitems = insertvalue { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] } %inserted.parent, i64 %.40.fca.2.load, 2
  %inserted.itemsize = insertvalue { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] } %inserted.nitems, i64 %.40.fca.3.load, 3
  %inserted.data = insertvalue { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] } %inserted.itemsize, double* %.40.fca.4.load, 4
  %inserted.shape = insertvalue { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] } %inserted.data, [6 x i64] %.46, 5
  %inserted.strides = insertvalue { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] } %inserted.shape, [6 x i64] %.47, 6
  %.73 = alloca i32, align 4
  store i32 0, i32* %.73, align 4
  switch i32 %.30, label %entry.if [
    i32 -2, label %common.ret
    i32 0, label %common.ret
  ]

entry.if:                                         ; preds = %entry
  %11 = icmp sgt i32 %.30, 0
  call void @numba_gil_ensure(i32* nonnull %.73)
  br i1 %11, label %entry.if.if, label %entry.if.endif

common.ret:                                       ; preds = %entry, %entry, %.76, %entry.if.if.if.if
  %common.ret.op = phi { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] } [ zeroinitializer, %entry.if.if.if.if ], [ %inserted.strides, %.76 ], [ %inserted.strides, %entry ], [ %inserted.strides, %entry ]
  ret { i8*, i8*, i64, i64, double*, [6 x i64], [6 x i64] } %common.ret.op

.76:                                              ; preds = %entry.if.endif, %entry.if.if.endif, %entry.if.if.endif.if, %entry.if.endif.endif.endif, %entry.if.endif.if
  %.124 = call i8* @PyUnicode_FromString(i8* getelementptr inbounds ([53 x i8], [53 x i8]* @".const.<numba.core.cpu.CPUContext object at 0x7f17d8920580>", i64 0, i64 0))
  call void @PyErr_WriteUnraisable(i8* %.124)
  call void @Py_DecRef(i8* %.124)
  call void @numba_gil_release(i32* nonnull %.73)
  br label %common.ret

entry.if.if:                                      ; preds = %entry.if
  call void @PyErr_Clear()
  %.79 = load { i8*, i32, i8*, i8*, i32 }, { i8*, i32, i8*, i8*, i32 }* %.39, align 8
  %.80 = extractvalue { i8*, i32, i8*, i8*, i32 } %.79, 4
  %.81 = icmp sgt i32 %.80, 0
  %.84 = extractvalue { i8*, i32, i8*, i8*, i32 } %.79, 0
  %.86 = extractvalue { i8*, i32, i8*, i8*, i32 } %.79, 1
  br i1 %.81, label %entry.if.if.if, label %entry.if.if.else

entry.if.endif:                                   ; preds = %entry.if
  switch i32 %.30, label %entry.if.endif.endif.endif [
    i32 -3, label %entry.if.endif.if
    i32 -1, label %.76
  ]

entry.if.if.if:                                   ; preds = %entry.if.if
  %.87 = sext i32 %.86 to i64
  %.88 = call i8* @PyBytes_FromStringAndSize(i8* %.84, i64 %.87)
  %.89 = load { i8*, i32, i8*, i8*, i32 }, { i8*, i32, i8*, i8*, i32 }* %.39, align 8
  %.90 = extractvalue { i8*, i32, i8*, i8*, i32 } %.89, 2
  %.92 = extractvalue { i8*, i32, i8*, i8*, i32 } %.89, 3
  %.93 = bitcast i8* %.92 to i8* (i8*)*
  %.94 = call i8* %.93(i8* %.90)
  %.95 = icmp eq i8* %.94, null
  br i1 %.95, label %entry.if.if.if.if, label %entry.if.if.if.endif, !prof !10

entry.if.if.else:                                 ; preds = %entry.if.if
  %.108 = extractvalue { i8*, i32, i8*, i8*, i32 } %.79, 2
  %.109 = call i8* @numba_unpickle(i8* %.84, i32 %.86, i8* %.108)
  br label %entry.if.if.endif

entry.if.if.endif:                                ; preds = %entry.if.if.if.endif, %entry.if.if.else
  %.111 = phi i8* [ %.99, %entry.if.if.if.endif ], [ %.109, %entry.if.if.else ]
  %.112.not = icmp eq i8* %.111, null
  br i1 %.112.not, label %.76, label %entry.if.if.endif.if, !prof !10

entry.if.if.if.if:                                ; preds = %entry.if.if.if
  call void @PyErr_SetString(i8* nonnull @PyExc_RuntimeError, i8* getelementptr inbounds ([61 x i8], [61 x i8]* @".const.Error creating Python tuple from runtime exception arguments.1", i64 0, i64 0))
  br label %common.ret

entry.if.if.if.endif:                             ; preds = %entry.if.if.if
  %.99 = call i8* @numba_runtime_build_excinfo_struct(i8* %.88, i8* nonnull %.94)
  %.100 = bitcast { i8*, i32, i8*, i8*, i32 }* %.39 to i8*
  call void @NRT_Free(i8* nonnull %.100)
  br label %entry.if.if.endif

entry.if.if.endif.if:                             ; preds = %entry.if.if.endif
  call void @numba_do_raise(i8* nonnull %.111)
  br label %.76

entry.if.endif.if:                                ; preds = %entry.if.endif
  call void @PyErr_SetNone(i8* nonnull @PyExc_StopIteration)
  br label %.76

entry.if.endif.endif.endif:                       ; preds = %entry.if.endif
  call void @PyErr_SetString(i8* nonnull @PyExc_SystemError, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @".const.unknown error when calling native function.2", i64 0, i64 0))
  br label %.76
}

declare void @numba_gil_ensure(i32*) local_unnamed_addr

declare i8* @PyUnicode_FromString(i8*) local_unnamed_addr

declare void @PyErr_WriteUnraisable(i8*) local_unnamed_addr

declare void @numba_gil_release(i32*) local_unnamed_addr

define linkonce_odr i32 @_ZN9froSTspin10misc_tools11numba_tools28numba_compute_tensor_stridesB3v51B38c8tJTIcFKzyF2ILShI4CrgQElQb6HczSBAA_3dE8UniTupleIxLi2EEx8UniTupleIxLi6EE({ i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* noalias nocapture writeonly %retptr, { i8*, i32, i8*, i8*, i32 }** noalias nocapture writeonly %excinfo, i64 %arg.mat_strides.0, i64 %arg.mat_strides.1, i64 %arg.nrr, i64 %arg.tensor_shape.0, i64 %arg.tensor_shape.1, i64 %arg.tensor_shape.2, i64 %arg.tensor_shape.3, i64 %arg.tensor_shape.4, i64 %arg.tensor_shape.5) local_unnamed_addr {
entry:
  %.7.i.i.i = tail call i8* @NRT_MemInfo_alloc_aligned(i64 48, i32 32), !noalias !32
  %.8.i.i.i = icmp eq i8* %.7.i.i.i, null
  br i1 %.8.i.i.i, label %B0.if, label %B0.endif.endif, !prof !10

B60:                                              ; preds = %switch.end, %B60.preheader
  %.148.034 = phi i64 [ %.217, %switch.end ], [ 1, %B60.preheader ]
  %.217 = add nuw i64 %.148.034, 1
  %0 = tail call { i64, i1 } @llvm.usub.with.overflow.i64(i64 6, i64 %.148.034)
  %math = extractvalue { i64, i1 } %0, 0
  %ov = extractvalue { i64, i1 } %0, 1
  %.258 = select i1 %ov, i64 6, i64 0
  %.259 = add i64 %.258, %math
  %.272 = getelementptr i64, i64* %.6.i1.i, i64 %.259
  %.273 = load i64, i64* %.272, align 8
  switch i64 %math, label %switch.else [
    i64 0, label %switch.end
    i64 -6, label %switch.end
    i64 1, label %switch.1
    i64 -5, label %switch.1
    i64 2, label %switch.2
    i64 -4, label %switch.2
    i64 3, label %switch.3
    i64 -3, label %switch.3
    i64 4, label %switch.4
    i64 -2, label %switch.4
    i64 5, label %switch.5
    i64 -1, label %switch.5
  ]

B128:                                             ; preds = %B128.preheader, %switch.end.1
  %lsr.iv = phi i64 [ %6, %switch.end.1 ], [ %.344, %B128.preheader ]
  %.508 = icmp slt i64 %lsr.iv, 0
  %.509 = select i1 %.508, i64 6, i64 0
  %1 = add i64 %.509, %lsr.iv
  %.523 = getelementptr i64, i64* %.6.i1.i, i64 %1
  %.524 = load i64, i64* %.523, align 8
  switch i64 %lsr.iv, label %switch.else.1 [
    i64 -1, label %switch.5.1
    i64 -6, label %switch.end.1
    i64 1, label %switch.1.1
    i64 -5, label %switch.1.1
    i64 2, label %switch.2.1
    i64 -4, label %switch.2.1
    i64 3, label %switch.3.1
    i64 -3, label %switch.3.1
    i64 4, label %switch.4.1
    i64 -2, label %switch.4.1
    i64 5, label %switch.5.1
  ]

common.ret:                                       ; preds = %switch.else.1, %switch.else, %B0.if, %B168
  %common.ret.op = phi i32 [ 0, %B168 ], [ 1, %switch.else ], [ 1, %switch.else.1 ], [ 1, %B0.if ]
  ret i32 %common.ret.op

B168:                                             ; preds = %switch.end.1, %B100.endif
  %retptr.repack381 = bitcast { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %retptr to i8**
  store i8* %.7.i.i.i, i8** %retptr.repack381, align 8
  %retptr.repack2 = getelementptr inbounds { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }, { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %retptr, i64 0, i32 1
  store i8* null, i8** %retptr.repack2, align 8
  %retptr.repack4 = getelementptr inbounds { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }, { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %retptr, i64 0, i32 2
  store i64 6, i64* %retptr.repack4, align 8
  %retptr.repack6 = getelementptr inbounds { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }, { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %retptr, i64 0, i32 3
  store i64 8, i64* %retptr.repack6, align 8
  %retptr.repack8 = getelementptr inbounds { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }, { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %retptr, i64 0, i32 4
  store i64* %.6.i1.i, i64** %retptr.repack8, align 8
  %2 = getelementptr inbounds { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }, { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %retptr, i64 0, i32 5, i64 0
  store i64 6, i64* %2, align 8
  %3 = getelementptr inbounds { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }, { i8*, i8*, i64, i64, i64*, [1 x i64], [1 x i64] }* %retptr, i64 0, i32 6, i64 0
  store i64 8, i64* %3, align 8
  br label %common.ret

B0.if:                                            ; preds = %entry
  store { i8*, i32, i8*, i8*, i32 }* @.const.picklebuf.139740397001280, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8
  br label %common.ret

B0.endif.endif:                                   ; preds = %entry
  %.5.i.i = getelementptr i8, i8* %.7.i.i.i, i64 24
  %4 = bitcast i8* %.5.i.i to i64**
  %.6.i1.i = load i64*, i64** %4, align 8, !noalias !42
  %.120 = getelementptr i64, i64* %.6.i1.i, i64 5
  store i64 %arg.mat_strides.1, i64* %.120, align 8
  %notsub = add i64 %arg.nrr, -6
  %.162.inv = icmp slt i64 %notsub, -1
  br i1 %.162.inv, label %B60.preheader, label %B100.endif

B60.preheader:                                    ; preds = %B0.endif.endif
  %5 = sub i64 6, %arg.nrr
  br label %B60

switch.else:                                      ; preds = %B60
  store { i8*, i32, i8*, i8*, i32 }* @.const.picklebuf.139740397330368, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8, !numba_exception_output !23
  br label %common.ret

switch.end:                                       ; preds = %switch.5, %switch.4, %switch.3, %switch.2, %switch.1, %B60, %B60
  %.283 = phi i64 [ %arg.tensor_shape.1, %switch.1 ], [ %arg.tensor_shape.2, %switch.2 ], [ %arg.tensor_shape.3, %switch.3 ], [ %arg.tensor_shape.4, %switch.4 ], [ %arg.tensor_shape.5, %switch.5 ], [ %arg.tensor_shape.0, %B60 ], [ %arg.tensor_shape.0, %B60 ]
  %.296 = mul nsw i64 %.283, %.273
  %.299 = sub i64 5, %.148.034
  %.313.inv = icmp slt i64 %.148.034, 6
  %.314 = select i1 %.313.inv, i64 0, i64 6
  %.315 = add i64 %.299, %.314
  %.328 = getelementptr i64, i64* %.6.i1.i, i64 %.315
  store i64 %.296, i64* %.328, align 8
  %exitcond36.not = icmp eq i64 %.217, %5
  br i1 %exitcond36.not, label %B100.endif, label %B60

switch.1:                                         ; preds = %B60, %B60
  br label %switch.end

switch.2:                                         ; preds = %B60, %B60
  br label %switch.end

switch.3:                                         ; preds = %B60, %B60
  br label %switch.end

switch.4:                                         ; preds = %B60, %B60
  br label %switch.end

switch.5:                                         ; preds = %B60, %B60
  br label %switch.end

B100.endif:                                       ; preds = %switch.end, %B0.endif.endif
  %.344 = add nsw i64 %arg.nrr, -1
  %.358.inv = icmp sgt i64 %arg.nrr, 0
  %.359 = select i1 %.358.inv, i64 0, i64 6
  %.360 = add i64 %.359, %.344
  %.373 = getelementptr i64, i64* %.6.i1.i, i64 %.360
  store i64 %arg.mat_strides.0, i64* %.373, align 8
  %.413 = icmp slt i64 %arg.nrr, 2
  %.45531.not37 = icmp eq i64 %.344, 0
  %.45531.not = select i1 %.413, i1 true, i1 %.45531.not37
  br i1 %.45531.not, label %B168, label %B128.preheader

B128.preheader:                                   ; preds = %B100.endif
  br label %B128

switch.else.1:                                    ; preds = %B128
  store { i8*, i32, i8*, i8*, i32 }* @.const.picklebuf.139740397330368, { i8*, i32, i8*, i8*, i32 }** %excinfo, align 8, !numba_exception_output !23
  br label %common.ret

switch.end.1:                                     ; preds = %switch.5.1, %switch.4.1, %switch.3.1, %switch.2.1, %switch.1.1, %B128
  %.534 = phi i64 [ %arg.tensor_shape.1, %switch.1.1 ], [ %arg.tensor_shape.2, %switch.2.1 ], [ %arg.tensor_shape.3, %switch.3.1 ], [ %arg.tensor_shape.4, %switch.4.1 ], [ %arg.tensor_shape.5, %switch.5.1 ], [ %arg.tensor_shape.0, %B128 ]
  %.547 = mul nsw i64 %.534, %.524
  %6 = add i64 %lsr.iv, -1
  %.564 = icmp slt i64 %6, 0
  %.565 = select i1 %.564, i64 6, i64 0
  %7 = add i64 %.565, %lsr.iv
  %8 = add i64 %7, -1
  %.579 = getelementptr i64, i64* %.6.i1.i, i64 %8
  store i64 %.547, i64* %.579, align 8
  %exitcond.not = icmp eq i64 %6, 0
  br i1 %exitcond.not, label %B168, label %B128

switch.1.1:                                       ; preds = %B128, %B128
  br label %switch.end.1

switch.2.1:                                       ; preds = %B128, %B128
  br label %switch.end.1

switch.3.1:                                       ; preds = %B128, %B128
  br label %switch.end.1

switch.4.1:                                       ; preds = %B128, %B128
  br label %switch.end.1

switch.5.1:                                       ; preds = %B128, %B128
  br label %switch.end.1
}

declare noalias i8* @NRT_MemInfo_alloc_aligned(i64, i32) local_unnamed_addr

; Function Attrs: mustprogress nofree nosync nounwind readnone speculatable willreturn
declare { i64, i1 } @llvm.usub.with.overflow.i64(i64, i64) #0

; Function Attrs: noinline
define linkonce_odr void @NRT_decref(i8* %.1) local_unnamed_addr #1 {
.3:
  %.4 = icmp eq i8* %.1, null
  br i1 %.4, label %common.ret, label %.3.endif, !prof !10

common.ret:                                       ; preds = %.3, %.3.endif
  ret void

.3.endif:                                         ; preds = %.3
  fence release
  %.8 = bitcast i8* %.1 to i64*
  %.4.i = atomicrmw sub i64* %.8, i64 1 monotonic, align 8
  %.10 = icmp eq i64 %.4.i, 1
  br i1 %.10, label %.3.endif.if, label %common.ret, !prof !10

.3.endif.if:                                      ; preds = %.3.endif
  fence acquire
  tail call void @NRT_MemInfo_call_dtor(i8* nonnull %.1)
  ret void
}

declare void @NRT_MemInfo_call_dtor(i8*) local_unnamed_addr

; Function Attrs: mustprogress nofree noinline norecurse nounwind willreturn
define linkonce_odr void @NRT_incref(i8* %.1) local_unnamed_addr #2 {
.3:
  %.4 = icmp eq i8* %.1, null
  br i1 %.4, label %common.ret, label %.3.endif, !prof !10

common.ret:                                       ; preds = %.3.endif, %.3
  ret void

.3.endif:                                         ; preds = %.3
  %.7 = bitcast i8* %.1 to i64*
  %.4.i = atomicrmw add i64* %.7, i64 1 monotonic, align 8
  br label %common.ret
}

; Function Attrs: argmemonly nofree nounwind willreturn writeonly
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #3

attributes #0 = { mustprogress nofree nosync nounwind readnone speculatable willreturn }
attributes #1 = { noinline }
attributes #2 = { mustprogress nofree noinline norecurse nounwind willreturn }
attributes #3 = { argmemonly nofree nounwind willreturn writeonly }

!0 = !{!1, !3, !4, !6, !7, !9}
!1 = distinct !{!1, !2, !"_ZN5numba2np8arrayobj18_ol_array_allocate12_3clocals_3e4implB2v6B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %retptr"}
!2 = distinct !{!2, !"_ZN5numba2np8arrayobj18_ol_array_allocate12_3clocals_3e4implB2v6B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj"}
!3 = distinct !{!3, !2, !"_ZN5numba2np8arrayobj18_ol_array_allocate12_3clocals_3e4implB2v6B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %excinfo"}
!4 = distinct !{!4, !5, !"_ZN5numba2np8arrayobj15_call_allocatorB2v5B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %retptr"}
!5 = distinct !{!5, !"_ZN5numba2np8arrayobj15_call_allocatorB2v5B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj"}
!6 = distinct !{!6, !5, !"_ZN5numba2np8arrayobj15_call_allocatorB2v5B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %excinfo"}
!7 = distinct !{!7, !8, !"_ZN5numba2np8arrayobj11ol_np_empty12_3clocals_3e4implB3v16B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE8UniTupleIxLi1EE16class_28int64_29: %retptr"}
!8 = distinct !{!8, !"_ZN5numba2np8arrayobj11ol_np_empty12_3clocals_3e4implB3v16B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE8UniTupleIxLi1EE16class_28int64_29"}
!9 = distinct !{!9, !8, !"_ZN5numba2np8arrayobj11ol_np_empty12_3clocals_3e4implB3v16B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE8UniTupleIxLi1EE16class_28int64_29: %excinfo"}
!10 = !{!"branch_weights", i32 1, i32 99}
!11 = !{!7, !9}
!12 = !{!13, !15, !16, !18, !19, !21}
!13 = distinct !{!13, !14, !"_ZN5numba2np8arrayobj18_ol_array_allocate12_3clocals_3e4implB2v6B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %retptr"}
!14 = distinct !{!14, !"_ZN5numba2np8arrayobj18_ol_array_allocate12_3clocals_3e4implB2v6B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj"}
!15 = distinct !{!15, !14, !"_ZN5numba2np8arrayobj18_ol_array_allocate12_3clocals_3e4implB2v6B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %excinfo"}
!16 = distinct !{!16, !17, !"_ZN5numba2np8arrayobj15_call_allocatorB2v5B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %retptr"}
!17 = distinct !{!17, !"_ZN5numba2np8arrayobj15_call_allocatorB2v5B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj"}
!18 = distinct !{!18, !17, !"_ZN5numba2np8arrayobj15_call_allocatorB2v5B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %excinfo"}
!19 = distinct !{!19, !20, !"_ZN5numba2np8arrayobj11ol_np_empty12_3clocals_3e4implB3v16B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE8UniTupleIxLi1EE16class_28int64_29: %retptr"}
!20 = distinct !{!20, !"_ZN5numba2np8arrayobj11ol_np_empty12_3clocals_3e4implB3v16B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE8UniTupleIxLi1EE16class_28int64_29"}
!21 = distinct !{!21, !20, !"_ZN5numba2np8arrayobj11ol_np_empty12_3clocals_3e4implB3v16B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE8UniTupleIxLi1EE16class_28int64_29: %excinfo"}
!22 = !{!19, !21}
!23 = !{i1 true}
!24 = !{!25}
!25 = distinct !{!25, !26, !"_ZN5numba2np6unsafe7ndarray14to_fixed_tuple12_3clocals_3e7codegen12_3clocals_3e4implB3v55B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAE5ArrayIxLi1E1C7mutable7alignedEx8UniTupleIxLi6EE: %retptr"}
!26 = distinct !{!26, !"_ZN5numba2np6unsafe7ndarray14to_fixed_tuple12_3clocals_3e7codegen12_3clocals_3e4implB3v55B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAE5ArrayIxLi1E1C7mutable7alignedEx8UniTupleIxLi6EE"}
!27 = !{!28}
!28 = distinct !{!28, !29, !"_ZN5numba2np6unsafe7ndarray14to_fixed_tuple12_3clocals_3e7codegen12_3clocals_3e4implB3v55B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAE5ArrayIxLi1E1C7mutable7alignedEx8UniTupleIxLi6EE: %retptr"}
!29 = distinct !{!29, !"_ZN5numba2np6unsafe7ndarray14to_fixed_tuple12_3clocals_3e7codegen12_3clocals_3e4implB3v55B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAE5ArrayIxLi1E1C7mutable7alignedEx8UniTupleIxLi6EE"}
!30 = !{!"branch_weights", i32 99, i32 1}
!31 = !{!"branch_weights", i32 199, i32 9801}
!32 = !{!33, !35, !36, !38, !39, !41}
!33 = distinct !{!33, !34, !"_ZN5numba2np8arrayobj18_ol_array_allocate12_3clocals_3e4implB2v6B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %retptr"}
!34 = distinct !{!34, !"_ZN5numba2np8arrayobj18_ol_array_allocate12_3clocals_3e4implB2v6B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj"}
!35 = distinct !{!35, !34, !"_ZN5numba2np8arrayobj18_ol_array_allocate12_3clocals_3e4implB2v6B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %excinfo"}
!36 = distinct !{!36, !37, !"_ZN5numba2np8arrayobj15_call_allocatorB2v5B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %retptr"}
!37 = distinct !{!37, !"_ZN5numba2np8arrayobj15_call_allocatorB2v5B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj"}
!38 = distinct !{!38, !37, !"_ZN5numba2np8arrayobj15_call_allocatorB2v5B42c8tJTC_2fWQI8IW1CiAAYKPM6RBFDjESZRVAJmaQIAEN29typeref_5b_3cclass_20_27numba4core5types8npytypes14Array_27_3e_5dExj: %excinfo"}
!39 = distinct !{!39, !40, !"_ZN5numba2np8arrayobj11ol_np_empty12_3clocals_3e4implB3v16B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE8UniTupleIxLi1EE16class_28int64_29: %retptr"}
!40 = distinct !{!40, !"_ZN5numba2np8arrayobj11ol_np_empty12_3clocals_3e4implB3v16B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE8UniTupleIxLi1EE16class_28int64_29"}
!41 = distinct !{!41, !40, !"_ZN5numba2np8arrayobj11ol_np_empty12_3clocals_3e4implB3v16B42c8tJTIcFKzyF2ILShI4CrgQElcaMVJhEEUSJJgA_3dE8UniTupleIxLi1EE16class_28int64_29: %excinfo"}
!42 = !{!39, !41}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants