Files
asmbench/dev_test/fail_test.py
2020-02-14 16:57:29 +01:00

96 lines
4.5 KiB
Python
Executable File

#!/usr/bin/env python3
import llvmlite.binding as llvm
import ctypes
llvm.initialize()
llvm.initialize_native_target()
llvm.initialize_native_asmprinter()
llvm.initialize_native_asmparser()
code = '''define i64 @"test"(i64 %"N")
{
entry:
%"loop_cond" = icmp slt i64 0, %"N"
br i1 %"loop_cond", label %"loop", label %"end"
loop:
%"loop_counter" = phi i64 [0, %"entry"], [%"loop_counter.1", %"loop"]
%in.0 = phi i64 [1, %"entry"], [%out.0, %"loop"]
%in.1 = phi i64 [1, %"entry"], [%out.1, %"loop"]
%in.2 = phi i64 [1, %"entry"], [%out.2, %"loop"]
%in.3 = phi i64 [1, %"entry"], [%out.3, %"loop"]
%in.4 = phi i64 [1, %"entry"], [%out.4, %"loop"]
%in.5 = phi i64 [1, %"entry"], [%out.5, %"loop"]
%in.6 = phi i64 [1, %"entry"], [%out.6, %"loop"]
%in.7 = phi i64 [1, %"entry"], [%out.7, %"loop"]
%"reg.0" = call i64 asm "add $2, $0", "=r,0,i" (i64 %in.0, i64 1)
%"reg.1" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.0", i64 1)
%"reg.2" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.1", i64 1)
%"reg.3" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.2", i64 1)
%"reg.4" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.3", i64 1)
%"reg.5" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.4", i64 1)
%"reg.6" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.5", i64 1)
%out.0 = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.6", i64 1)
%"reg.7" = call i64 asm "add $2, $0", "=r,0,i" (i64 %in.1, i64 1)
%"reg.8" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.7", i64 1)
%"reg.9" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.8", i64 1)
%"reg.10" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.9", i64 1)
%"reg.11" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.10", i64 1)
%"reg.12" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.11", i64 1)
%"reg.13" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.12", i64 1)
%out.1 = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.13", i64 1)
%"reg.14" = call i64 asm "add $2, $0", "=r,0,i" (i64 %in.2, i64 1)
%"reg.15" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.14", i64 1)
%"reg.16" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.15", i64 1)
%"reg.17" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.16", i64 1)
%"reg.18" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.17", i64 1)
%"reg.19" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.18", i64 1)
%"reg.20" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.19", i64 1)
%out.2 = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.20", i64 1)
%"reg.21" = call i64 asm "add $2, $0", "=r,0,i" (i64 %in.3, i64 1)
%"reg.22" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.21", i64 1)
%"reg.23" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.22", i64 1)
%"reg.24" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.23", i64 1)
%"reg.25" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.24", i64 1)
%"reg.26" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.25", i64 1)
%"reg.27" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.26", i64 1)
%out.3 = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.27", i64 1)
%"reg.28" = call i64 asm "add $2, $0", "=r,0,i" (i64 %in.4, i64 1)
%"reg.29" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.28", i64 1)
%"reg.30" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.29", i64 1)
%"reg.31" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.30", i64 1)
%"reg.32" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.31", i64 1)
%"reg.33" = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.32", i64 1)
%out.4 = call i64 asm "add $2, $0", "=r,0,i" (i64 %"reg.33", i64 1)
%out.5 = call i64 asm "add $2, $0", "=r,0,i" (i64 %in.5, i64 1)
%out.6 = call i64 asm "add $2, $0", "=r,0,i" (i64 %in.6, i64 1)
%out.7 = call i64 asm "add $2, $0", "=r,0,i" (i64 %in.7, i64 1)
%"loop_counter.1" = add i64 %"loop_counter", 1
%"loop_cond.1" = icmp slt i64 %"loop_counter.1", %"N"
br i1 %"loop_cond.1", label %"loop", label %"end"
end:
%"ret" = phi i64 [-1, %"entry"], [%"loop_counter", %"loop"]
ret i64 %"ret"
}'''
llvm_module = llvm.parse_assembly(code)
llvm_module.verify()
tm = llvm.Target.from_default_triple().create_target_machine(
features=llvm.get_host_cpu_features().flatten(),
cpu=llvm.get_host_cpu_name(),
opt=3)
ee = llvm.create_mcjit_compiler(llvm_module, tm)
ee.finalize_object()
cfptr = ee.get_function_address('test')
cfunc = ctypes.CFUNCTYPE(ctypes.c_int64, ctypes.c_int64)(cfptr)
N = 100
ret = cfunc(N)
print(ret)
if ret == 0:
print("FAIL")
elif ret == N-1:
print("Probably good.")