[Beignet] [PATCH 1/5] Refine the code in llvm_printf_parser.cpp

Zhigang Gong zhigang.gong at linux.intel.com
Thu Jun 19 02:33:20 PDT 2014


This patch LGTM, pushed, thanks.

On Wed, Jun 18, 2014 at 02:42:07PM +0800, junyan.he at inbox.com wrote:
> From: Junyan He <junyan.he at linux.intel.com>
> 
> Fix some typo and use macro to simplify the code.
> 
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
>  backend/src/llvm/llvm_printf_parser.cpp | 163 +++++++++++++-------------------
>  1 file changed, 65 insertions(+), 98 deletions(-)
> 
> diff --git a/backend/src/llvm/llvm_printf_parser.cpp b/backend/src/llvm/llvm_printf_parser.cpp
> index ec8e76d..fa06995 100644
> --- a/backend/src/llvm/llvm_printf_parser.cpp
> +++ b/backend/src/llvm/llvm_printf_parser.cpp
> @@ -16,7 +16,7 @@
>   */
>  
>  /**
> - * \file llvm_printf.cpp
> + * \file llvm_printf_parser.cpp
>   *
>   * When there are printf functions existing, we have something to do here.
>   * Because the GPU's feature, it is relatively hard to parse and caculate the
> @@ -152,19 +152,10 @@ namespace gbe
>        FMT_PLUS_PLUS;
>        switch (*fmt) {
>          case '2':
> -          state->vector_n = 2;
> -          FMT_PLUS_PLUS;
> -          break;
>          case '3':
> -          state->vector_n = 3;
> -          FMT_PLUS_PLUS;
> -          break;
>          case '4':
> -          state->vector_n = 4;
> -          FMT_PLUS_PLUS;
> -          break;
>          case '8':
> -          state->vector_n = 8;
> +          state->vector_n = *fmt - '0';
>            FMT_PLUS_PLUS;
>            break;
>          case '1':
> @@ -226,7 +217,7 @@ namespace gbe
>          CONVERSION_SPEC_AND_RET('s', A)
>          CONVERSION_SPEC_AND_RET('p', P)
>  
> -        // %% has been handled
> +      // %% has been handled
>  
>        default:
>          return -1;
> @@ -278,6 +269,7 @@ again:
>          goto error;
>  
>        printf_fmt->push_back(&state);
> +      num++;
>  
>        if (rend == end)
>          break;
> @@ -285,10 +277,11 @@ again:
>        begin = rend;
>      }
>  
> +#if 0
> +    int j = 0;
>      for (auto &s : *printf_fmt) {
> +      j++;
>        if (s.type == PRINTF_SLOT_TYPE_STATE) {
> -        num++;
> -#if 0
>          printf("---- %d ---: state : \n", j);
>          printf("		     left_justified : %d\n", s.state->left_justified);
>          printf("		     sign_symbol: %d\n", s.state->sign_symbol);
> @@ -299,11 +292,11 @@ again:
>          printf("		     precision : %d\n", s.state->precision);
>          printf("		     length_modifier : %d\n", s.state->length_modifier);
>          printf("		     conversion_specifier : %d\n", s.state->conversion_specifier);
> -#endif
>        } else if (s.type == PRINTF_SLOT_TYPE_STRING) {
> -        //printf("---- %d ---: string :  %s\n", j, s.str);
> +        printf("---- %d ---: string :  %s\n", j, s.str);
>        }
>      }
> +#endif
>  
>      return printf_fmt;
>  
> @@ -328,7 +321,8 @@ error:
>      static map<CallInst*, PrintfSet::PrintfFmt*> printfs;
>      int printf_num;
>  
> -    PrintfParser(void) : FunctionPass(ID) {
> +    PrintfParser(void) : FunctionPass(ID)
> +    {
>        module = NULL;
>        builder = NULL;
>        intTy = NULL;
> @@ -339,7 +333,8 @@ error:
>        printf_num = 0;
>      }
>  
> -    ~PrintfParser(void) {
> +    ~PrintfParser(void)
> +    {
>        for (auto &s : printfs) {
>          delete s.second;
>          s.second = NULL;
> @@ -351,7 +346,8 @@ error:
>      bool parseOnePrintfInstruction(CallInst *& call);
>      int generateOneParameterInst(PrintfSlot& slot, Value& arg);
>  
> -    virtual const char *getPassName() const {
> +    virtual const char *getPassName() const
> +    {
>        return "Printf Parser";
>      }
>  
> @@ -393,81 +389,52 @@ error:
>      /* FIXME: Because the OpenCL language do not support va macro, and we do not want
>         to introduce the va_list, va_start and va_end into our code, we just simulate
>         the function calls to caculate the offset caculation here. */
> -    CallInst* group_id_2 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                             "__gen_ocl_get_group_id2",
> -                             IntegerType::getInt32Ty(module->getContext()),
> -                             NULL)));
> -    CallInst* group_id_1 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                             "__gen_ocl_get_group_id1",
> -                             IntegerType::getInt32Ty(module->getContext()),
> -                             NULL)));
> -    CallInst* group_id_0 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                             "__gen_ocl_get_group_id0",
> -                             IntegerType::getInt32Ty(module->getContext()),
> -                             NULL)));
> -
> -    CallInst* global_size_2 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                                "__gen_ocl_get_global_size2",
> -                                IntegerType::getInt32Ty(module->getContext()),
> -                                NULL)));
> -    CallInst* global_size_1 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                                "__gen_ocl_get_global_size1",
> -                                IntegerType::getInt32Ty(module->getContext()),
> -                                NULL)));
> -    CallInst* global_size_0 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                                "__gen_ocl_get_global_size0",
> -                                IntegerType::getInt32Ty(module->getContext()),
> -                                NULL)));
> -
> -    CallInst* local_id_2 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                             "__gen_ocl_get_local_id2",
> -                             IntegerType::getInt32Ty(module->getContext()),
> -                             NULL)));
> -    CallInst* local_id_1 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                             "__gen_ocl_get_local_id1",
> -                             IntegerType::getInt32Ty(module->getContext()),
> -                             NULL)));
> -    CallInst* local_id_0 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                             "__gen_ocl_get_local_id0",
> -                             IntegerType::getInt32Ty(module->getContext()),
> -                             NULL)));
> -
> -    CallInst* local_size_2 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                               "__gen_ocl_get_local_size2",
> -                               IntegerType::getInt32Ty(module->getContext()),
> -                               NULL)));
> -    CallInst* local_size_1 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                               "__gen_ocl_get_local_size1",
> -                               IntegerType::getInt32Ty(module->getContext()),
> -                               NULL)));
> -    CallInst* local_size_0 = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
> -                               "__gen_ocl_get_local_size0",
> -                               IntegerType::getInt32Ty(module->getContext()),
> -                               NULL)));
> +#define BUILD_CALL_INST(name) \
> +    CallInst* name = builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction( \
> +                             "__gen_ocl_get_"#name,                                         \
> +                             IntegerType::getInt32Ty(module->getContext()),                 \
> +                             NULL)))
> +
> +    BUILD_CALL_INST(group_id2);
> +    BUILD_CALL_INST(group_id1);
> +    BUILD_CALL_INST(group_id0);
> +    BUILD_CALL_INST(global_size2);
> +    BUILD_CALL_INST(global_size1);
> +    BUILD_CALL_INST(global_size0);
> +    BUILD_CALL_INST(local_id2);
> +    BUILD_CALL_INST(local_id1);
> +    BUILD_CALL_INST(local_id0);
> +    BUILD_CALL_INST(local_size2);
> +    BUILD_CALL_INST(local_size1);
> +    BUILD_CALL_INST(local_size0);
> +
> +#undef BUILD_CALL_INST
> +
>      Value* op0 = NULL;
>      Value* val = NULL;
> -    /* offset = ((local_id_2 + local_size_2 * group_id_2) * (global_size_1 * global_size_0)
> -       + (local_id_1 + local_size_1 * group_id_1) * global_size_0
> -       + (local_id_0 + local_size_0 * group_id_0)) * sizeof(type)  */
> -
> -    // local_size_2 * group_id_2
> -    val = builder->CreateMul(local_size_2, group_id_2);
> -    // local_id_2 + local_size_2 * group_id_2
> -    val = builder->CreateAdd(local_id_2, val);
> -    // global_size_1 * global_size_0
> -    op0 = builder->CreateMul(global_size_1, global_size_0);
> -    // (local_id_2 + local_size_2 * group_id_2) * (global_size_1 * global_size_0)
> +    /* calculate offset for later usage.
> +       offset = ((local_id2 + local_size2 * group_id2) * (global_size1 * global_size0)
> +       + (local_id1 + local_size1 * group_id1) * global_size0
> +       + (local_id0 + local_size0 * group_id0)) * sizeof(type)  */
> +
> +    // local_size2 * group_id2
> +    val = builder->CreateMul(local_size2, group_id2);
> +    // local_id2 + local_size2 * group_id2
> +    val = builder->CreateAdd(local_id2, val);
> +    // global_size1 * global_size0
> +    op0 = builder->CreateMul(global_size1, global_size0);
> +    // (local_id2 + local_size2 * group_id2) * (global_size1 * global_size0)
>      Value* offset1 = builder->CreateMul(val, op0);
> -    // local_size_1 * group_id_1
> -    val = builder->CreateMul(local_size_1, group_id_1);
> -    // local_id_1 + local_size_1 * group_id_1
> -    val = builder->CreateAdd(local_id_1, val);
> -    // (local_id_1 + local_size_1 * group_id_1) * global_size_0
> -    Value* offset2 = builder->CreateMul(val, global_size_0);
> -    // local_size_0 * group_id_0
> -    val = builder->CreateMul(local_size_0, group_id_0);
> -    // local_id_0 + local_size_0 * group_id_0
> -    val = builder->CreateAdd(local_id_0, val);
> +    // local_size1 * group_id1
> +    val = builder->CreateMul(local_size1, group_id1);
> +    // local_id1 + local_size1 * group_id1
> +    val = builder->CreateAdd(local_id1, val);
> +    // (local_id1 + local_size1 * group_id1) * global_size_0
> +    Value* offset2 = builder->CreateMul(val, global_size0);
> +    // local_size0 * group_id0
> +    val = builder->CreateMul(local_size0, group_id0);
> +    // local_id0 + local_size0 * group_id0
> +    val = builder->CreateAdd(local_id0, val);
>      // The total sum
>      val = builder->CreateAdd(val, offset1);
>      Value* offset = builder->CreateAdd(val, offset2);
> @@ -475,12 +442,12 @@ error:
>      /////////////////////////////////////////////////////
>      /* calculate index address.
>         index_addr = (index_offset + offset )* sizeof(int) + index_buf_ptr
> -       index_offset = global_size_2 * global_size_1 * global_size_0 * printf_num */
> +       index_offset = global_size2 * global_size1 * global_size0 * printf_num */
>  
> -    // global_size_2 * global_size_1
> -    op0 = builder->CreateMul(global_size_2, global_size_1);
> -    // global_size_2 * global_size_1 * global_size_0
> -    Value* glXg2Xg3 = builder->CreateMul(op0, global_size_0);
> +    // global_size2 * global_size1
> +    op0 = builder->CreateMul(global_size2, global_size1);
> +    // global_size2 * global_size1 * global_size0
> +    Value* glXg2Xg3 = builder->CreateMul(op0, global_size0);
>      Value* index_offset = builder->CreateMul(glXg2Xg3, ConstantInt::get(intTy, printf_num));
>      // index_offset + offset
>      op0 = builder->CreateAdd(index_offset, offset);
> @@ -509,9 +476,9 @@ error:
>        /////////////////////////////////////////////////////
>        /* Calculate the data address.
>        data_addr = data_offset + pbuf_ptr + offset * sizeof(specify)
> -      data_offset = global_size_2 * global_size_1 * global_size_0 * out_buf_sizeof_offset
> +      data_offset = global_size2 * global_size1 * global_size0 * out_buf_sizeof_offset
>  
> -      //global_size_2 * global_size_1 * global_size_0 * out_buf_sizeof_offset */
> +      //global_size2 * global_size1 * global_size0 * out_buf_sizeof_offset */
>        op0 = builder->CreateMul(glXg2Xg3, ConstantInt::get(intTy, out_buf_sizeof_offset));
>        //offset * sizeof(specify)
>        val = builder->CreateMul(offset, ConstantInt::get(intTy, sizeof_size));
> -- 
> 1.8.3.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list