llvmpy/llvm_cbuilder/tests/test_nestedloops.py
2012-11-10 18:56:02 -06:00

128 lines
3.1 KiB
Python

from llvm.core import *
from llvm.passes import *
from llvm.ee import *
from llvm_cbuilder import *
import llvm_cbuilder.shortnames as C
import unittest, logging
def nestedloop1(d):
z = 0
for x in range(100):
for y in range(100):
z += x * d + int(y / d)
return z
def gen_nestedloop1(mod):
functype = Type.function(C.int, [C.int])
func = mod.add_function(functype, 'nestedloop1')
cb = CBuilder(func)
d = cb.args[0]
x = cb.var(C.int)
y = cb.var(C.int)
z = cb.var(C.int)
one = cb.constant(C.int, 1)
zero = cb.constant(C.int, 0)
limit = cb.constant(C.int, 100)
z.assign(zero)
x.assign(zero)
with cb.loop() as outer:
with outer.condition() as setcond:
setcond( x < limit )
with outer.body():
y.assign(zero)
with cb.loop() as inner:
with inner.condition() as setcond:
setcond( y < limit )
with inner.body():
z += x * d + y / d
y += one
x += one
cb.ret(z)
cb.close()
return func
def nestedloop2(d):
z = 0
for x in range(1, 100):
for y in range(1, 100):
if x > y:
z += int(x / y) * d
else:
z += int(y / x) * d
return z
def gen_nestedloop2(mod):
functype = Type.function(C.int, [C.int])
func = mod.add_function(functype, 'nestedloop2')
cb = CBuilder(func)
d = cb.args[0]
x = cb.var(C.int)
y = cb.var(C.int)
z = cb.var(C.int)
one = cb.constant(C.int, 1)
zero = cb.constant(C.int, 0)
limit = cb.constant(C.int, 100)
z.assign(zero)
x.assign(one)
with cb.loop() as outer:
with outer.condition() as setcond:
setcond( x < limit )
with outer.body():
y.assign(one)
with cb.loop() as inner:
with inner.condition() as setcond:
setcond( y < limit )
with inner.body():
with cb.ifelse(x > y) as ifelse:
with ifelse.then():
z += x / y * d
with ifelse.otherwise():
z += y / x * d
y += one
x += one
cb.ret(z)
cb.close()
return func
class TestNestedLoop(unittest.TestCase):
def test_nestedloop1(self):
mod = Module.new(__name__)
lfunc = gen_nestedloop1(mod)
logging.debug(mod)
mod.verify()
exe = CExecutor(mod)
func = exe.get_ctype_function(lfunc, 'int, int')
for x in range(1, 100):
self.assertEqual(func(x), int(nestedloop1(x)))
def test_nestedloop2(self):
mod = Module.new(__name__)
lfunc = gen_nestedloop2(mod)
logging.debug(mod)
mod.verify()
exe = CExecutor(mod)
func = exe.get_ctype_function(lfunc, 'int, int')
for x in range(1, 100):
self.assertEqual(func(x), int(nestedloop2(x)))
if __name__ == '__main__':
unittest.main()