[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