Added stream vectorize.

This commit is contained in:
Siu Kwan Lam 2012-08-22 13:22:37 -05:00
commit eeda441dac

View file

@ -5,6 +5,7 @@
import contextlib import contextlib
import llvm.core as lc import llvm.core as lc
import llvm.ee as le import llvm.ee as le
import llvm.passes as lp
from llvm import LLVMException from llvm import LLVMException
from . import shortnames as types from . import shortnames as types
@ -245,6 +246,9 @@ class CBuilder(object):
for i in args: for i in args:
if isinstance(i, str): if isinstance(i, str):
itemsfmt.append(i.replace('%', '%%')) itemsfmt.append(i.replace('%', '%%'))
elif isinstance(i.type, lc.PointerType):
itemsfmt.append("%p")
items.append(i)
else: else:
tyname = str(i.type) tyname = str(i.type)
if tyname == 'float': if tyname == 'float':
@ -258,6 +262,26 @@ class CBuilder(object):
fmt = ' '.join(itemsfmt) + '\n' fmt = ' '.join(itemsfmt) + '\n'
return self.printf(self.constant_string(fmt), *items) return self.printf(self.constant_string(fmt), *items)
def sizeof(self, ty):
bldr = self.builder
ptrty = types.pointer(ty)
first = lc.Constant.null(ptrty)
second = bldr.gep(first, [lc.Constant.int(types.intp, 1)])
firstint = bldr.ptrtoint(first, types.intp)
secondint = bldr.ptrtoint(second, types.intp)
diff = bldr.sub(secondint, firstint)
return CTemp(self, diff)
def min(self, x, y):
z = self.var(x.type)
with self.ifelse( x < y ) as ifelse:
with ifelse.then():
z.assign(x)
with ifelse.otherwise():
z.assign(y)
return z
def var(self, ty, value=None, name=''): def var(self, ty, value=None, name=''):
'''allocate variable on the stack '''allocate variable on the stack
@ -771,6 +795,14 @@ class CDefinition(CBuilder):
cbuilder.__init__(func) cbuilder.__init__(func)
cbuilder.body(*cbuilder.args) cbuilder.body(*cbuilder.args)
cbuilder.close() cbuilder.close()
# optimize
fpm = lp.FunctionPassManager.new(module)
pmb = lp.PassManagerBuilder.new()
pmb.opt_level = 3
pmb.vectorize = True
pmb.populate(fpm)
fpm.run(func)
return func return func
def body(self): def body(self):
@ -1039,11 +1071,15 @@ class CValue(object):
raise TypeError("Must be a pointer or vector; got %s" % self.type) raise TypeError("Must be a pointer or vector; got %s" % self.type)
def __setitem__(self, idx, val): def __setitem__(self, idx, val):
self._ensure_is_vector()
idx = _auto_coerce_index(self.parent, idx) idx = _auto_coerce_index(self.parent, idx)
bldr = self.parent.builder bldr = self.parent.builder
vec = bldr.insert_element(self.value, val.value, idx.value) if self.is_vector:
bldr.store(vec, self.ptr) vec = bldr.insert_element(self.value, val.value, idx.value)
bldr.store(vec, self.ptr)
elif self.is_pointer:
self[idx].assign(val)
else:
raise TypeError("Must be a pointer or vector; got %s" % self.type)
def load(self, volatile=False): def load(self, volatile=False):
'''memory load for pointer types '''memory load for pointer types