[Beignet] [PATCH V2] Backend: Refine printfs into ir unit

Yang, Rong R rong.r.yang at intel.com
Tue Nov 24 19:32:08 PST 2015


LGTM, pushed, thanks.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Pan Xiuli
> Sent: Friday, November 20, 2015 15:08
> To: beignet at lists.freedesktop.org
> Cc: Pan, Xiuli
> Subject: [Beignet] [PATCH V2] Backend: Refine printfs into ir unit
> 
> Move the printfs of PrintfParser into the ir::Unit to make the gbe thread safe.
> The old static printfs will be cleared by othrer thread when running in
> multithread.
> V2:
> Rebase the patch
> 
> Signed-off-by: Pan Xiuli <xiuli.pan at intel.com>
> ---
>  backend/src/ir/printf.cpp               |  1 +
>  backend/src/ir/printf.hpp               |  2 +-
>  backend/src/ir/unit.cpp                 |  1 +
>  backend/src/ir/unit.hpp                 |  5 +++++
>  backend/src/llvm/llvm_gen_backend.cpp   |  6 ++++++
>  backend/src/llvm/llvm_gen_backend.hpp   |  2 +-
>  backend/src/llvm/llvm_printf_parser.cpp | 35 +++++++++----------------------
> --
>  backend/src/llvm/llvm_to_gen.cpp        |  2 +-
>  8 files changed, 25 insertions(+), 29 deletions(-)
> 
> diff --git a/backend/src/ir/printf.cpp b/backend/src/ir/printf.cpp index
> eb1c199..2e08248 100644
> --- a/backend/src/ir/printf.cpp
> +++ b/backend/src/ir/printf.cpp
> @@ -23,6 +23,7 @@
> 
>  #include <stdarg.h>
>  #include "printf.hpp"
> +#include "ir/unit.hpp"
> 
>  namespace gbe
>  {
> diff --git a/backend/src/ir/printf.hpp b/backend/src/ir/printf.hpp index
> df58437..85153a5 100644
> --- a/backend/src/ir/printf.hpp
> +++ b/backend/src/ir/printf.hpp
> @@ -26,12 +26,12 @@
>  #include <string.h>
>  #include "sys/map.hpp"
>  #include "sys/vector.hpp"
> -#include "unit.hpp"
> 
>  namespace gbe
>  {
>    namespace ir
>    {
> +    class Unit;
> 
>      /* Things about printf info. */
>      enum {
> diff --git a/backend/src/ir/unit.cpp b/backend/src/ir/unit.cpp index
> 5604244..a350c60 100644
> --- a/backend/src/ir/unit.cpp
> +++ b/backend/src/ir/unit.cpp
> @@ -34,6 +34,7 @@ namespace ir {
>    Unit::~Unit(void) {
>      for (const auto &pair : functions) GBE_DELETE(pair.second);
>      delete profilingInfo;
> +    for (const auto &pair : printfs) GBE_DELETE(pair.second);
>    }
>    Function *Unit::getFunction(const std::string &name) const {
>      auto it = functions.find(name);
> diff --git a/backend/src/ir/unit.hpp b/backend/src/ir/unit.hpp index
> 41dc1ae..10a1af6 100644
> --- a/backend/src/ir/unit.hpp
> +++ b/backend/src/ir/unit.hpp
> @@ -27,8 +27,11 @@
>  #include "ir/constant.hpp"
>  #include "ir/register.hpp"
>  #include "ir/profiling.hpp"
> +#include "ir/printf.hpp"
>  #include "sys/map.hpp"
> 
> +#include "llvm/IR/Instructions.h"
> +
>  namespace gbe {
>  namespace ir {
> 
> @@ -43,6 +46,8 @@ namespace ir {
>    {
>    public:
>      typedef map<std::string, Function*> FunctionSet;
> +    /*! Moved from printf pass */
> +    map<llvm::CallInst*, PrintfSet::PrintfFmt*> printfs;
>      /*! Create an empty unit */
>      Unit(PointerSize pointerSize = POINTER_32_BITS);
>      /*! Release everything (*including* the function pointers) */ diff --git
> a/backend/src/llvm/llvm_gen_backend.cpp
> b/backend/src/llvm/llvm_gen_backend.cpp
> index d1b6f98..0252746 100644
> --- a/backend/src/llvm/llvm_gen_backend.cpp
> +++ b/backend/src/llvm/llvm_gen_backend.cpp
> @@ -672,6 +672,12 @@ namespace gbe
>      // handle load of dword/qword with unaligned address
>      void emitUnalignedDQLoadStore(ir::Register ptr, Value *llvmValues,
> ir::AddressSpace addrSpace, ir::Register bti, bool isLoad, bool dwAligned,
> bool fixedBTI);
>      void visitInstruction(Instruction &I) {NOT_SUPPORTED;}
> +    void* getPrintfInfo(CallInst* inst)
> +    {
> +      if (unit.printfs[inst])
> +        return (void*)unit.printfs[inst];
> +      return NULL;
> +    }
>      private:
>        ir::ImmediateIndex processConstantImmIndexImpl(Constant *CPV,
> int32_t index = 0u);
>        template <typename T, typename P = T> diff --git
> a/backend/src/llvm/llvm_gen_backend.hpp
> b/backend/src/llvm/llvm_gen_backend.hpp
> index cf601d3..23688f5 100644
> --- a/backend/src/llvm/llvm_gen_backend.hpp
> +++ b/backend/src/llvm/llvm_gen_backend.hpp
> @@ -140,7 +140,7 @@ namespace gbe
>    llvm::BasicBlockPass *createIntrinsicLoweringPass();
> 
>    /*! Passer the printf function call. */
> -  llvm::FunctionPass* createPrintfParserPass();
> +  llvm::FunctionPass* createPrintfParserPass(ir::Unit &unit);
> 
>    /*! Insert the time stamp for profiling. */
>    llvm::FunctionPass* createProfilingInserterPass(int profilingType, ir::Unit
> &unit); diff --git a/backend/src/llvm/llvm_printf_parser.cpp
> b/backend/src/llvm/llvm_printf_parser.cpp
> index e2adcd8..422f16b 100644
> --- a/backend/src/llvm/llvm_printf_parser.cpp
> +++ b/backend/src/llvm/llvm_printf_parser.cpp
> @@ -38,6 +38,7 @@
>  #include "llvm/llvm_gen_backend.hpp"
>  #include "sys/map.hpp"
>  #include "ir/printf.hpp"
> +#include "ir/unit.hpp"
> 
>  using namespace llvm;
> 
> @@ -301,7 +302,7 @@ error:
>      Value* g1Xg2Xg3;
>      Value* wg_offset;
>      int out_buf_sizeof_offset;
> -    static map<CallInst*, PrintfSet::PrintfFmt*> printfs;
> +    ir::Unit &unit;
>      int printf_num;
>      int totalSizeofSize;
> 
> @@ -310,13 +311,13 @@ error:
>        PrintfSet::PrintfFmt* printf_fmt;
>      };
> 
> -    PrintfParser(void) : FunctionPass(ID)
> +    PrintfParser(ir::Unit &unit) : FunctionPass(ID),
> +    unit(unit)
>      {
>        module = NULL;
>        builder = NULL;
>        intTy = NULL;
>        out_buf_sizeof_offset = 0;
> -      printfs.clear();
>        pbuf_ptr = NULL;
>        index_buf_ptr = NULL;
>        g1Xg2Xg3 = NULL;
> @@ -325,15 +326,6 @@ error:
>        totalSizeofSize = 0;
>      }
> 
> -    ~PrintfParser(void)
> -    {
> -      for (auto &s : printfs) {
> -        delete s.second;
> -        s.second = NULL;
> -      }
> -      printfs.clear();
> -    }
> -
>      bool parseOnePrintfInstruction(CallInst * call, PrintfParserInfo& info, int&
> sizeof_size);
>      bool generateOneParameterInst(PrintfSlot& slot, Value*& arg, Type*&
> dst_type, int& sizeof_size);
>      bool generateOnePrintfInstruction(PrintfParserInfo& pInfo); @@ -428,9
> +420,9 @@ error:
>      CallInst* printf_inst = builder->CreateCall(cast<llvm::Function>(module-
> >getOrInsertFunction(
>                                "__gen_ocl_printf", Type::getVoidTy(module->getContext()),
>                                NULL)));
> -    assert(printfs[printf_inst] == NULL);
> -    printfs[printf_inst] = pInfo.printf_fmt;
> -    printfs[printf_inst]->second = printf_num;
> +    assert(unit.printfs[printf_inst] == NULL);
> +    unit.printfs[printf_inst] = pInfo.printf_fmt;
> +    unit.printfs[printf_inst]->second = printf_num;
>      printf_num++;
>      return true;
>    }
> @@ -972,18 +964,9 @@ error:
>      return false;
>    }
> 
> -  map<CallInst*, PrintfSet::PrintfFmt*> PrintfParser::printfs;
> -
> -  void* getPrintfInfo(CallInst* inst)
> -  {
> -    if (PrintfParser::printfs[inst])
> -      return (void*)PrintfParser::printfs[inst];
> -    return NULL;
> -  }
> -
> -  FunctionPass* createPrintfParserPass()
> +  FunctionPass* createPrintfParserPass(ir::Unit &unit)
>    {
> -    return new PrintfParser();
> +    return new PrintfParser(unit);
>    }
>    char PrintfParser::ID = 0;
> 
> diff --git a/backend/src/llvm/llvm_to_gen.cpp
> b/backend/src/llvm/llvm_to_gen.cpp
> index 8a076ca..83b56ae 100644
> --- a/backend/src/llvm/llvm_to_gen.cpp
> +++ b/backend/src/llvm/llvm_to_gen.cpp
> @@ -275,7 +275,7 @@ namespace gbe
>      passes.add(createPromoteMemoryToRegisterPass());
>      if(optLevel > 0)
>        passes.add(createGVNPass());                 // Remove redundancies
> -    passes.add(createPrintfParserPass());
> +    passes.add(createPrintfParserPass(unit));
>      passes.add(createExpandConstantExprPass());    // expand ConstantExpr
>      passes.add(createScalarizePass());             // Expand all vector ops
>      passes.add(createExpandLargeIntegersPass());   // legalize large integer
> operation
> --
> 2.1.4
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list