Add GEP inbounds
This commit is contained in:
parent
9874d8048d
commit
8b58488bbd
3 changed files with 14 additions and 8 deletions
|
|
@ -878,6 +878,9 @@ _wrap_objobj2obj(LLVMBuildFree, LLVMBuilderRef, LLVMValueRef, LLVMValueRef)
|
|||
_wrap_objobjstr2obj(LLVMBuildLoad, LLVMBuilderRef, LLVMValueRef, LLVMValueRef)
|
||||
_wrap_objobjobj2obj(LLVMBuildStore, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef)
|
||||
_wrap_objobjliststr2obj(LLVMBuildGEP, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef)
|
||||
_wrap_objobjliststr2obj(LLVMBuildInBoundsGEP, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef)
|
||||
|
||||
|
||||
|
||||
_wrap_objint2none(LLVMLdSetAlignment, LLVMValueRef)
|
||||
_wrap_objint2none(LLVMStSetAlignment, LLVMValueRef)
|
||||
|
|
@ -1959,6 +1962,7 @@ static PyMethodDef core_methods[] = {
|
|||
_method( LLVMBuildLoad )
|
||||
_method( LLVMBuildStore )
|
||||
_method( LLVMBuildGEP )
|
||||
_method( LLVMBuildInBoundsGEP )
|
||||
|
||||
_method( LLVMLdSetAlignment )
|
||||
_method( LLVMStSetAlignment )
|
||||
|
|
|
|||
|
|
@ -2066,11 +2066,14 @@ class Builder(object):
|
|||
inst.set_volatile(volatile)
|
||||
return inst
|
||||
|
||||
def gep(self, ptr, indices, name=""):
|
||||
def gep(self, ptr, indices, name="", inbounds=False):
|
||||
check_is_value(ptr)
|
||||
index_ptrs = unpack_values(indices)
|
||||
return _make_value(
|
||||
_core.LLVMBuildGEP(self.ptr, ptr.ptr, index_ptrs, name))
|
||||
if inbounds:
|
||||
ret = _core.LLVMBuildInBoundsGEP(self.ptr, ptr.ptr, index_ptrs, name)
|
||||
else:
|
||||
ret = _core.LLVMBuildGEP(self.ptr, ptr.ptr, index_ptrs, name)
|
||||
return _make_value(ret)
|
||||
|
||||
# casts and extensions
|
||||
|
||||
|
|
|
|||
|
|
@ -818,8 +818,7 @@ class CDefinition(object):
|
|||
if optimize:
|
||||
fpm = lp.FunctionPassManager.new(module)
|
||||
pmb = lp.PassManagerBuilder.new()
|
||||
pmb.opt_level = 3
|
||||
pmb.vectorize = True
|
||||
pmb.opt_level = 2
|
||||
pmb.populate(fpm)
|
||||
fpm.run(func)
|
||||
|
||||
|
|
@ -1135,11 +1134,11 @@ class PointerIndexing(OperatorMixin):
|
|||
# Case #1: A[idx:] get pointer offset by idx
|
||||
if not idx.step and not idx.stop:
|
||||
idx = _auto_coerce_index(self.parent, idx.start)
|
||||
ptr = bldr.gep(self.value, [idx.value])
|
||||
ptr = bldr.gep(self.value, [idx.value], inbounds=True)
|
||||
return CArray(self.parent, ptr)
|
||||
else: # return an variable at idx
|
||||
idx = _auto_coerce_index(self.parent, idx)
|
||||
ptr = bldr.gep(self.value, [idx.value])
|
||||
ptr = bldr.gep(self.value, [idx.value], inbounds=True)
|
||||
return CVar(self.parent, ptr)
|
||||
|
||||
def __setitem__(self, idx, val):
|
||||
|
|
@ -1184,7 +1183,7 @@ class PointerValue(PointerIndexing, PointerCasting):
|
|||
inst = self.parent.builder.store(val.value, self.value, **kws)
|
||||
if nontemporal:
|
||||
self.parent.set_memop_non_temporal(inst)
|
||||
|
||||
return inst
|
||||
|
||||
def atomic_load(self, ordering, align=None, crossthread=True):
|
||||
'''atomic load memory for pointer types
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue