[Beignet] [PATCH Release_v1.1] Backend: Fix the bug of printf in multi kernels within on file.
junyan.he at inbox.com
junyan.he at inbox.com
Thu Jan 14 00:00:49 PST 2016
From: Junyan He <junyan.he at linux.intel.com>
Signed-off-by: Junyan He <junyan.he at linux.intel.com>
---
backend/src/llvm/llvm_printf_parser.cpp | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/backend/src/llvm/llvm_printf_parser.cpp b/backend/src/llvm/llvm_printf_parser.cpp
index a0a2e21..9a054f1 100644
--- a/backend/src/llvm/llvm_printf_parser.cpp
+++ b/backend/src/llvm/llvm_printf_parser.cpp
@@ -328,6 +328,8 @@ error:
Module* module;
IRBuilder<>* builder;
Type* intTy;
+ llvm::Constant * pbuf_global;
+ llvm::Constant * index_buf_global;
Value* pbuf_ptr;
Value* index_buf_ptr;
Value* g1Xg2Xg3;
@@ -342,13 +344,11 @@ error:
PrintfSet::PrintfFmt* printf_fmt;
};
- PrintfParser(void) : FunctionPass(ID)
- {
+ void stateInit(void) {
module = NULL;
builder = NULL;
intTy = NULL;
out_buf_sizeof_offset = 0;
- printfs.clear();
pbuf_ptr = NULL;
index_buf_ptr = NULL;
g1Xg2Xg3 = NULL;
@@ -357,6 +357,13 @@ error:
totalSizeofSize = 0;
}
+ PrintfParser(void) : FunctionPass(ID)
+ {
+ stateInit();
+ pbuf_global = NULL;
+ index_buf_global = NULL;
+ }
+
~PrintfParser(void)
{
for (auto &s : printfs) {
@@ -554,6 +561,7 @@ error:
bool PrintfParser::runOnFunction(llvm::Function &F)
{
+ stateInit();
bool changed = false;
bool hasPrintf = false;
switch (F.getCallingConv()) {
@@ -630,29 +638,30 @@ error:
if (!hasPrintf)
return changed;
- if (!pbuf_ptr) {
+ if (!pbuf_global) {
/* alloc a new buffer ptr to collect the print output. */
Type *ptrTy = Type::getInt32PtrTy(module->getContext(), 1);
- llvm::Constant *pBuf = new GlobalVariable(*module, ptrTy, false,
+ pbuf_global= new GlobalVariable(*module, ptrTy, false,
GlobalVariable::ExternalLinkage,
nullptr,
StringRef("__gen_ocl_printf_buf"),
nullptr,
GlobalVariable::NotThreadLocal,
1);
- pbuf_ptr = builder->CreatePtrToInt(pBuf, Type::getInt32Ty(module->getContext()));
}
- if (!index_buf_ptr) {
+ pbuf_ptr = builder->CreatePtrToInt(pbuf_global, Type::getInt32Ty(module->getContext()));
+
+ if (!index_buf_global) {
Type *ptrTy = Type::getInt32PtrTy(module->getContext(), 1);
- llvm::Constant *pBuf = new GlobalVariable(*module, ptrTy, false,
+ index_buf_global = new GlobalVariable(*module, ptrTy, false,
GlobalVariable::ExternalLinkage,
nullptr,
StringRef("__gen_ocl_printf_index_buf"),
nullptr,
GlobalVariable::NotThreadLocal,
1);
- index_buf_ptr = builder->CreatePtrToInt(pBuf, Type::getInt32Ty(module->getContext()));
}
+ index_buf_ptr = builder->CreatePtrToInt(index_buf_global, Type::getInt32Ty(module->getContext()));
if (!wg_offset || !g1Xg2Xg3) {
Value* op0 = NULL;
--
1.9.1
More information about the Beignet
mailing list