59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
import unittest
|
|
|
|
from numba.tests.support import (TestCase, override_config)
|
|
from numba import njit
|
|
from numba.core import types
|
|
import llvmlite.binding as llvm
|
|
|
|
|
|
class TestPassManagerOptimization(TestCase):
|
|
""" Tests that pass manager is not overriding the intended
|
|
optimization level.
|
|
"""
|
|
|
|
def _get_llvmir(self, fn, sig):
|
|
with override_config('OPT', 0):
|
|
fn.compile(sig)
|
|
return fn.inspect_llvm(sig)
|
|
|
|
def test_override_config(self):
|
|
@njit(debug=True, error_model='numpy')
|
|
def foo(a):
|
|
b = a + 1.23
|
|
c = b * 2.34
|
|
d = b / c
|
|
print(d)
|
|
return d
|
|
|
|
sig = (types.float64,)
|
|
full_ir = self._get_llvmir(foo, sig=sig)
|
|
|
|
module = llvm.parse_assembly(full_ir)
|
|
|
|
name = foo.overloads[foo.signatures[0]].fndesc.mangled_name
|
|
funcs = [x for x in module.functions if x.name == name]
|
|
self.assertEqual(len(funcs), 1)
|
|
func = funcs[0]
|
|
blocks = [x for x in func.blocks]
|
|
self.assertGreater(len(blocks), 1)
|
|
block = blocks[0]
|
|
|
|
# Find sequence with non-debug instructions
|
|
instrs = [x for x in block.instructions if x.opcode != 'call']
|
|
op_expect = {'fadd', 'fmul', 'fdiv'}
|
|
started = False
|
|
for x in instrs:
|
|
if x.opcode in op_expect:
|
|
op_expect.remove(x.opcode)
|
|
if not started:
|
|
started = True
|
|
elif op_expect and started:
|
|
break
|
|
|
|
self.assertGreater(len(op_expect), 0,
|
|
"Function was optimized unexpectedly")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|