diff --git a/llvm/_core.cpp b/llvm/_core.cpp index 75b50ed..fa6087a 100644 --- a/llvm/_core.cpp +++ b/llvm/_core.cpp @@ -988,6 +988,11 @@ _wrap_obj2obj(LLVMPassManagerBuilderGetSizeLevel, LLVMPassManagerBuilderRef, int _wrap_objint2none(LLVMPassManagerBuilderSetVectorize, LLVMPassManagerBuilderRef) _wrap_obj2obj(LLVMPassManagerBuilderGetVectorize, LLVMPassManagerBuilderRef, int) +#if LLVM_VERSION_MAJOR >= 3 && LLVM_VERSION_MINOR >= 2 +_wrap_objint2none(LLVMPassManagerBuilderSetLoopVectorize, LLVMPassManagerBuilderRef) +_wrap_obj2obj(LLVMPassManagerBuilderGetLoopVectorize, LLVMPassManagerBuilderRef, int) +#endif //llvm-3.2 + _wrap_objint2none(LLVMPassManagerBuilderSetDisableUnitAtATime, LLVMPassManagerBuilderRef) _wrap_obj2obj(LLVMPassManagerBuilderGetDisableUnitAtATime, @@ -1989,7 +1994,10 @@ static PyMethodDef core_methods[] = { _method( LLVMPassManagerBuilderSetVectorize ) _method( LLVMPassManagerBuilderGetVectorize ) - +#if LLVM_VERSION_MAJOR >= 3 && LLVM_VERSION_MINOR >= 2 + _method( LLVMPassManagerBuilderSetLoopVectorize ) + _method( LLVMPassManagerBuilderGetLoopVectorize ) +#endif // llvm-3.2 _method( LLVMPassManagerBuilderSetDisableUnitAtATime ) _method( LLVMPassManagerBuilderGetDisableUnitAtATime ) diff --git a/llvm/extra.cpp b/llvm/extra.cpp index 1b6d9fc..484f9ac 100644 --- a/llvm/extra.cpp +++ b/llvm/extra.cpp @@ -669,6 +669,19 @@ int LLVMPassManagerBuilderGetVectorize(LLVMPassManagerBuilderRef pmb){ return llvm::unwrap(pmb)->Vectorize; } +#if LLVM_VERSION_MAJOR >= 3 && LLVM_VERSION_MINOR >= 2 +void LLVMPassManagerBuilderSetLoopVectorize(LLVMPassManagerBuilderRef pmb, + int flag) +{ + llvm::unwrap(pmb)->LoopVectorize = flag; +} + +int LLVMPassManagerBuilderGetLoopVectorize(LLVMPassManagerBuilderRef pmb){ + return llvm::unwrap(pmb)->LoopVectorize; +} +#endif // llvm-3.2 + + int LLVMPassManagerBuilderGetDisableUnitAtATime(LLVMPassManagerBuilderRef pmb) { return llvm::unwrap(pmb)->DisableUnitAtATime; diff --git a/llvm/extra.h b/llvm/extra.h index 26235e1..97cc31b 100644 --- a/llvm/extra.h +++ b/llvm/extra.h @@ -312,6 +312,19 @@ void LLVMPassManagerBuilderSetVectorize(LLVMPassManagerBuilderRef pmb, int flag) */ int LLVMPassManagerBuilderGetVectorize(LLVMPassManagerBuilderRef pmb); +#if LLVM_VERSION_MAJOR >= 3 && LLVM_VERSION_MINOR >= 2 +/* + * Wraps PassManagerBuilder::LoopVectorize + */ +void LLVMPassManagerBuilderSetLoopVectorize(LLVMPassManagerBuilderRef pmb, + int flag); + +/* + * Wraps PassManagerBuilder::LoopVectorize + */ +int LLVMPassManagerBuilderGetLoopVectorize(LLVMPassManagerBuilderRef pmb); +#endif // llvm-3.2 + /* * Wraps PassManagerBuilder::DisableUnitAtATime */ diff --git a/llvm/passes.py b/llvm/passes.py index fb5dc7c..d06fa59 100644 --- a/llvm/passes.py +++ b/llvm/passes.py @@ -41,6 +41,7 @@ import llvm.core as core # module, function etc. import llvm._core as _core # C wrappers import llvm._util as _util # Utility functions +import warnings #===----------------------------------------------------------------------=== # Pass manager builder #===----------------------------------------------------------------------=== @@ -89,6 +90,21 @@ class PassManagerBuilder(object): vectorize = property(_get_vectorize, _set_vectorize) + def _set_loop_vectorize(self, enable): + try: + _core.LLVMPassManagerBuilderSetLoopVectorize(self.ptr, + int(bool(enable))) + except AttributeError: + warnings.warn("Ignored. LLVM-3.1 & prior do not support loop vectorizer.") + + def _get_loop_vectorize(self): + try: + return bool(_core.LLVMPassManagerBuilderGetLoopVectorize(self.ptr)) + except AttributeError: + return False + + loop_vectorize = property(_get_loop_vectorize, _set_loop_vectorize) + def _set_disable_unit_at_a_time(self, disable): return _core.LLVMPassManagerBuilderSetDisableUnitAtATime( self.ptr, disable)