From d78253ebe3e987e06bb8321e1aa14da98d6de3a4 Mon Sep 17 00:00:00 2001 From: Siu Kwan Lam Date: Tue, 21 Aug 2012 18:28:04 -0500 Subject: [PATCH] Add control to alignment of ld/st inst --- llvm/_core.cpp | 6 ++++++ llvm/core.py | 8 ++++++-- llvm/extra.cpp | 9 +++++++++ llvm/extra.h | 10 ++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/llvm/_core.cpp b/llvm/_core.cpp index 5168d57..367acca 100644 --- a/llvm/_core.cpp +++ b/llvm/_core.cpp @@ -752,6 +752,9 @@ _wrap_objobjstr2obj(LLVMBuildLoad, LLVMBuilderRef, LLVMValueRef, LLVMValueRef) _wrap_objobjobj2obj(LLVMBuildStore, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef) _wrap_objobjliststr2obj(LLVMBuildGEP, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef) +_wrap_objint2none(LLVMLdSetAlignment, LLVMValueRef) +_wrap_objint2none(LLVMStSetAlignment, LLVMValueRef) + /* Casts */ _wrap_objobjobjstr2obj(LLVMBuildTrunc, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, LLVMValueRef) @@ -1753,6 +1756,9 @@ static PyMethodDef core_methods[] = { _method( LLVMBuildStore ) _method( LLVMBuildGEP ) + _method( LLVMLdSetAlignment ) + _method( LLVMStSetAlignment ) + /* Casts */ _method( LLVMBuildTrunc ) _method( LLVMBuildZExt ) diff --git a/llvm/core.py b/llvm/core.py index 623960a..de0ff29 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -1840,17 +1840,21 @@ class Builder(object): check_is_value(ptr) return _make_value(_core.LLVMBuildFree(self.ptr, ptr.ptr)) - def load(self, ptr, name="", volatile=False): + def load(self, ptr, name="", align=0, volatile=False): check_is_value(ptr) inst = _make_value(_core.LLVMBuildLoad(self.ptr, ptr.ptr, name)) + if align: + _core.LLVMLdSetAlignment(inst.ptr, align) if volatile: inst.set_volatile(volatile) return inst - def store(self, value, ptr, volatile=False): + def store(self, value, ptr, align=0, volatile=False): check_is_value(value) check_is_value(ptr) inst = _make_value(_core.LLVMBuildStore(self.ptr, value.ptr, ptr.ptr)) + if align: + _core.LLVMStSetAlignment(inst.ptr, align) if volatile: inst.set_volatile(volatile) return inst diff --git a/llvm/extra.cpp b/llvm/extra.cpp index 591b3fe..89bf3a0 100644 --- a/llvm/extra.cpp +++ b/llvm/extra.cpp @@ -126,6 +126,15 @@ const CodeGenOpt::Level OptLevelMap[] = { }; } // end anony namespace +void LLVMLdSetAlignment(LLVMValueRef inst, unsigned align) +{ + return llvm::unwrap(inst)->setAlignment(align); +} + +void LLVMStSetAlignment(LLVMValueRef inst, unsigned align) +{ + return llvm::unwrap(inst)->setAlignment(align); +} const char * LLVMGetHostCPUName() { diff --git a/llvm/extra.h b/llvm/extra.h index a34a53e..ea6e01e 100644 --- a/llvm/extra.h +++ b/llvm/extra.h @@ -55,6 +55,16 @@ extern "C" { #endif +/* + * Wraps LoadInst::SetAlignment + */ +void LLVMLdSetAlignment(LLVMValueRef inst, unsigned align); + +/* + * Wraps StoreInst::SetAlignment + */ +void LLVMStSetAlignment(LLVMValueRef inst, unsigned align); + const char * LLVMGetHostCPUName(); int LLVMInitializeNativeTargetAsmPrinter();