diff --git a/llvm/_core.cpp b/llvm/_core.cpp index 5acfa83..6f13c61 100644 --- a/llvm/_core.cpp +++ b/llvm/_core.cpp @@ -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 ) diff --git a/llvm/core.py b/llvm/core.py index 4e59675..fa9dc77 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -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 diff --git a/llvm_cbuilder/builder.py b/llvm_cbuilder/builder.py index 6aa5e1d..64083b1 100644 --- a/llvm_cbuilder/builder.py +++ b/llvm_cbuilder/builder.py @@ -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