Add intrinsic check
This commit is contained in:
parent
b9cccbf9ae
commit
43095609c3
3 changed files with 186 additions and 1 deletions
|
|
@ -42,6 +42,10 @@ def test(verbosity=3):
|
||||||
from llvm.tests import run
|
from llvm.tests import run
|
||||||
|
|
||||||
result = run(verbosity=verbosity)
|
result = run(verbosity=verbosity)
|
||||||
|
errct = len(result.failures) + len(result.errors)
|
||||||
|
|
||||||
return len(result.failures) + len(result.errors)
|
# Dump some intrinsic usage result with MCJIT.
|
||||||
|
from llvm.utils import check_intrinsics
|
||||||
|
check_intrinsics.main()
|
||||||
|
|
||||||
|
return errct
|
||||||
|
|
|
||||||
0
llvm/utils/__init__.py
Normal file
0
llvm/utils/__init__.py
Normal file
181
llvm/utils/check_intrinsics.py
Normal file
181
llvm/utils/check_intrinsics.py
Normal file
|
|
@ -0,0 +1,181 @@
|
||||||
|
from __future__ import print_function, absolute_import
|
||||||
|
import sys
|
||||||
|
from llvm.core import Type, Function, Builder, Module
|
||||||
|
import llvm.core as lc
|
||||||
|
import llvm.ee as le
|
||||||
|
import multiprocessing
|
||||||
|
from ctypes import *
|
||||||
|
|
||||||
|
INTRINSICS = {}
|
||||||
|
|
||||||
|
CTYPES_MAP = {
|
||||||
|
Type.int(): c_int32,
|
||||||
|
Type.int(64): c_int64,
|
||||||
|
Type.float(): c_float,
|
||||||
|
Type.double(): c_double,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def register(name, retty, *args):
|
||||||
|
def wrap(fn):
|
||||||
|
INTRINSICS[name] = (retty, args), fn
|
||||||
|
return fn
|
||||||
|
return wrap
|
||||||
|
|
||||||
|
|
||||||
|
def intr_impl(intrcode, *types):
|
||||||
|
def impl(module, builder, args):
|
||||||
|
intr = Function.intrinsic(module, intrcode, types)
|
||||||
|
r = builder.call(intr, args)
|
||||||
|
return r
|
||||||
|
return impl
|
||||||
|
|
||||||
|
|
||||||
|
register("llvm.powi.f64", Type.double(), Type.double(), Type.int())\
|
||||||
|
(intr_impl(lc.INTR_POWI, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.powi.f32", Type.float(), Type.float(), Type.int())\
|
||||||
|
(intr_impl(lc.INTR_POWI, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.pow.f64", Type.double(), Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_POW, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.pow.f32", Type.float(), Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_POW, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.sin.f64", Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_SIN, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.sin.f32", Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_SIN, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.cos.f64", Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_COS, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.cos.f32", Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_COS, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.log.f64", Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_LOG, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.log.f32", Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_LOG, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.log2.f64", Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_LOG2, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.log2.f32", Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_LOG2, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.log10.f64", Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_LOG10, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.log10.f32", Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_LOG10, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.sqrt.f64", Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_SQRT, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.sqrt.f32", Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_SQRT, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.exp.f64", Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_EXP, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.exp.f32", Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_EXP, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.exp2.f64", Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_EXP2, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.exp2.f32", Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_EXP2, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.fabs.f64", Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_FABS, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.fabs.f32", Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_FABS, Type.float()))
|
||||||
|
|
||||||
|
register("llvm.floor.f64", Type.double(), Type.double())\
|
||||||
|
(intr_impl(lc.INTR_FLOOR, Type.double()))
|
||||||
|
|
||||||
|
register("llvm.floor.f32", Type.float(), Type.float())\
|
||||||
|
(intr_impl(lc.INTR_FLOOR, Type.float()))
|
||||||
|
|
||||||
|
|
||||||
|
def build_test(name):
|
||||||
|
(retty, args), impl = INTRINSICS[name]
|
||||||
|
module = Module.new("test.%s" % name)
|
||||||
|
fn = module.add_function(Type.function(retty, args), name="test_%s" % name)
|
||||||
|
builder = Builder.new(fn.append_basic_block(""))
|
||||||
|
retval = impl(module, builder, fn.args)
|
||||||
|
builder.ret(retval)
|
||||||
|
fn.verify()
|
||||||
|
module.verify()
|
||||||
|
return module, fn
|
||||||
|
|
||||||
|
|
||||||
|
def run_test(name):
|
||||||
|
module, fn = build_test(name)
|
||||||
|
eb = le.EngineBuilder.new(module).mcjit(True)
|
||||||
|
engine = eb.create()
|
||||||
|
ptr = engine.get_pointer_to_function(fn)
|
||||||
|
|
||||||
|
argtys = fn.type.pointee.args
|
||||||
|
retty = fn.type.pointee.return_type
|
||||||
|
cargtys = [CTYPES_MAP[a] for a in argtys]
|
||||||
|
cretty = CTYPES_MAP[retty]
|
||||||
|
cfunc = CFUNCTYPE(cretty, *cargtys)(ptr)
|
||||||
|
args = [1] * len(cargtys)
|
||||||
|
cfunc(*args)
|
||||||
|
|
||||||
|
|
||||||
|
def spawner(name):
|
||||||
|
print("Testing %s" % name)
|
||||||
|
proc = multiprocessing.Process(target=run_test, args=(name,))
|
||||||
|
|
||||||
|
print('-' * 80)
|
||||||
|
proc.start()
|
||||||
|
proc.join()
|
||||||
|
|
||||||
|
if proc.exitcode != 0:
|
||||||
|
print("FAILED")
|
||||||
|
ok = False
|
||||||
|
else:
|
||||||
|
print("PASSED")
|
||||||
|
ok = True
|
||||||
|
print('=' * 80)
|
||||||
|
print()
|
||||||
|
|
||||||
|
return ok
|
||||||
|
|
||||||
|
USAGE = """
|
||||||
|
Args: [name]
|
||||||
|
|
||||||
|
name: intrinsic name to test
|
||||||
|
|
||||||
|
If no name is given, test all intrinsics.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv=()):
|
||||||
|
if len(argv) == 1:
|
||||||
|
intrname = argv[1]
|
||||||
|
spawner(intrname)
|
||||||
|
elif not argv:
|
||||||
|
failed = []
|
||||||
|
for name in sorted(INTRINSICS):
|
||||||
|
if not spawner(name):
|
||||||
|
failed.append(name)
|
||||||
|
|
||||||
|
print("Summary:")
|
||||||
|
for name in failed:
|
||||||
|
print("%s failed" % name)
|
||||||
|
else:
|
||||||
|
print(USAGE)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main(argv=sys.argv[1:])
|
||||||
Loading…
Add table
Add a link
Reference in a new issue