[Beignet] [Printf v2][PATCH 07/12] Add the implementation of printf ir instruction.

yan.wang at linux.intel.com yan.wang at linux.intel.com
Fri Feb 5 03:54:37 UTC 2016


Sorry. I have re-sent 7/12.

Yan Wang

> patch of 06 and 07 have the same title?
> I think it is a typo here.
> Please correct it.
> All the other things are OK, just rename this one and
> the whole patchset can be pushed later.
>
> Also can push my patch about printf test cases together.
>
> On Mon, Feb 01, 2016 at 03:42:16PM +0800, yan.wang at linux.intel.com wrote:
>> Date: Mon,  1 Feb 2016 15:42:16 +0800
>> From: yan.wang at linux.intel.com
>> To: beignet at lists.freedesktop.org
>> Cc: Yan Wang <yan.wang at linux.intel.com>
>> Subject: [Beignet] [Printf v2][PATCH 07/12] Add the implementation of
>>  printf ir instruction.
>> X-Mailer: git-send-email 2.5.0
>>
>> From: Yan Wang <yan.wang at linux.intel.com>
>>
>> Contributor: Junyan He <junyan.he at linux.intel.com>
>> Signed-off-by: Yan Wang <yan.wang at linux.intel.com>
>> ---
>>  backend/src/llvm/llvm_gen_backend.cpp | 95
>> +++++++++++++++++++++++++++++------
>>  1 file changed, 80 insertions(+), 15 deletions(-)
>>
>> diff --git a/backend/src/llvm/llvm_gen_backend.cpp
>> b/backend/src/llvm/llvm_gen_backend.cpp
>> index dba9dba..4870285 100644
>> --- a/backend/src/llvm/llvm_gen_backend.cpp
>> +++ b/backend/src/llvm/llvm_gen_backend.cpp
>> @@ -486,6 +486,9 @@ namespace gbe
>>      typedef map<Value *, SmallVector<Value *, 4>>::iterator
>> PtrOrigMapIter;
>>      // map pointer source to bti
>>      map<Value *, unsigned> BtiMap;
>> +    // map printf pointer source to bti
>> +    int printfBti;
>> +    uint32_t printfNum;
>>      // map ptr to its bti register
>>      map<Value *, Value *> BtiValueMap;
>>      // map ptr to it's base
>> @@ -520,6 +523,8 @@ namespace gbe
>>          unit(unit),
>>          ctx(unit),
>>          regTranslator(ctx),
>> +        printfBti(-1),
>> +        printfNum(0),
>>          LI(0),
>>          TheModule(0),
>>          btiBase(BTI_RESERVED_NUM),
>> @@ -586,6 +591,7 @@ namespace gbe
>>        addrStoreInst.clear();
>>        // Reset for next function
>>        btiBase = BTI_RESERVED_NUM;
>> +      printfBti = -1;
>>        return false;
>>      }
>>      /*! Given a possible pointer value, find out the interested escape
>> like
>> @@ -594,7 +600,7 @@ namespace gbe
>>      /*! For all possible pointers, GlobalVariable, function pointer
>> argument,
>>          alloca instruction, find their pointer escape points */
>>      void analyzePointerOrigin(Function &F);
>> -    unsigned getNewBti(Value *origin, bool isImage);
>> +    unsigned getNewBti(Value *origin, bool force);
>>      void assignBti(Function &F);
>>      bool isSingleBti(Value *Val);
>>      Value *getBtiRegister(Value *v);
>> @@ -717,11 +723,10 @@ 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;
>> +    ir::PrintfSet::PrintfFmt* getPrintfInfo(CallInst* inst) {
>> +      if (unit.printfs.find(inst) == unit.printfs.end())
>> +        return NULL;
>> +      return &unit.printfs[inst];
>>      }
>>      private:
>>        void setDebugInfo_CTX(llvm::Instruction * insn); // store the
>> debug infomation in context for subsequently passing to Gen insn
>> @@ -1127,21 +1132,15 @@ namespace gbe
>>      }
>>    }
>>
>> -  unsigned GenWriter::getNewBti(Value *origin, bool isImage) {
>> +  unsigned GenWriter::getNewBti(Value *origin, bool force) {
>>      unsigned new_bti = 0;
>> -    if (isImage) {
>> +    if (force) {
>>        new_bti = btiBase;
>>        incBtiBase();
>>        return new_bti;
>>      }
>>
>> -    if(origin->getName().equals(StringRef("__gen_ocl_printf_buf"))) {
>> -      new_bti = btiBase;
>> -      incBtiBase();
>> -    } else if
>> (origin->getName().equals(StringRef("__gen_ocl_printf_index_buf"))) {
>> -      new_bti = btiBase;
>> -      incBtiBase();
>> -    } else if
>> (origin->getName().equals(StringRef("__gen_ocl_profiling_buf"))) {
>> +    if (origin->getName().equals(StringRef("__gen_ocl_profiling_buf")))
>> {
>>        new_bti = btiBase;
>>        incBtiBase();
>>      }
>> @@ -3716,6 +3715,16 @@ namespace gbe
>>          this->newRegister(&I);
>>          break;
>>        case GEN_OCL_PRINTF:
>> +        this->newRegister(&I);  // fall through
>> +      case GEN_OCL_PUTS:
>> +      {
>> +         // We need a new BTI as printf output.
>> +         if (printfBti < 0) {
>> +           printfBti = this->getNewBti(&I, true);
>> +           ctx.getFunction().getPrintfSet()->setBufBTI(printfBti);
>> +         }
>> +         break;
>> +      }
>>        case GEN_OCL_CALC_TIMESTAMP:
>>        case GEN_OCL_STORE_PROFILING:
>>        case GEN_OCL_DEBUGWAIT:
>> @@ -4527,6 +4536,62 @@ namespace gbe
>>
>>            case GEN_OCL_PRINTF:
>>            {
>> +            ir::PrintfSet::PrintfFmt* fmt = getPrintfInfo(&I);
>> +            if (fmt == NULL)
>> +              break;
>> +
>> +            ctx.getFunction().getPrintfSet()->append(printfNum, fmt);
>> +
>> +            vector<ir::Register> tupleData;
>> +            vector<ir::Type> tupleTypeData;
>> +            int argNum = static_cast<int>(I.getNumOperands());
>> +            argNum -= 2; // no fmt and last NULL.
>> +            int realArgNum = argNum;
>> +
>> +            for (int n = 0; n < argNum; n++) {
>> +              /* First, ignore %s, the strings are recorded and not
>> passed to GPU. */
>> +              llvm::Constant* args =
>> dyn_cast<llvm::ConstantExpr>(I.getOperand(n + 1));
>> +              llvm::Constant* args_ptr = NULL;
>> +              if (args)
>> +                args_ptr =
>> dyn_cast<llvm::Constant>(args->getOperand(0));
>> +
>> +              if (args_ptr) {
>> +                ConstantDataSequential* fmt_arg =
>> dyn_cast<ConstantDataSequential>(args_ptr->getOperand(0));
>> +                if (fmt_arg && fmt_arg->isCString()) {
>> +                  realArgNum--;
>> +                  continue;
>> +                }
>> +              }
>> +
>> +              Type * type = I.getOperand(n + 1)->getType();
>> +              if (type->isVectorTy()) {
>> +                uint32_t srcElemNum = 0;
>> +                Value *srcValue = I.getOperand(n + 1);
>> +                ir::Type srcType = getVectorInfo(ctx, srcValue,
>> srcElemNum);
>> +                GBE_ASSERT(!(srcType == ir::TYPE_S64 || srcType ==
>> ir::TYPE_DOUBLE));
>> +
>> +                uint32_t elemID = 0;
>> +                for (elemID = 0; elemID < srcElemNum; ++elemID) {
>> +                  ir::Register reg = getRegister(srcValue, elemID);
>> +                  tupleData.push_back(reg);
>> +                  tupleTypeData.push_back(srcType);
>> +                }
>> +                realArgNum += srcElemNum - 1;
>> +              } else {
>> +                ir::Register reg = getRegister(I.getOperand(n + 1));
>> +                tupleData.push_back(reg);
>> +                tupleTypeData.push_back(getType(ctx, I.getOperand(n +
>> 1)->getType()));
>> +              }
>> +            }
>> +
>> +            ir::Tuple tuple;
>> +            ir::Tuple typeTuple;
>> +            if (realArgNum > 0) {
>> +              tuple = ctx.arrayTuple(&tupleData[0], realArgNum);
>> +              typeTuple = ctx.arrayTypeTuple(&tupleTypeData[0],
>> realArgNum);
>> +            }
>> +            ctx.PRINTF(getRegister(&I), tuple, typeTuple, realArgNum,
>> printfBti, printfNum);
>> +            printfNum++;
>>              break;
>>            }
>>            case GEN_OCL_CALC_TIMESTAMP:
>> --
>> 2.4.3
>>
>> _______________________________________________
>> Beignet mailing list
>> Beignet at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/beignet
>
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
>



More information about the Beignet mailing list