[Beignet] [PATCH 1/8] strip unsupported attributes and calling conventions.

Yang, Rong R rong.r.yang at intel.com
Sun Apr 12 21:59:20 PDT 2015


The patchset LGTM, thanks.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Zhigang Gong
> Sent: Wednesday, April 1, 2015 10:06
> To: beignet at lists.freedesktop.org
> Cc: Gong, Zhigang
> Subject: [Beignet] [PATCH 1/8] strip unsupported attributes and calling
> conventions.
> 
> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
> ---
>  backend/src/CMakeLists.txt            |   1 +
>  backend/src/llvm/StripAttributes.cpp  | 119
> ++++++++++++++++++++++++++++++++++
>  backend/src/llvm/llvm_gen_backend.cpp |   7 +-
>  backend/src/llvm/llvm_gen_backend.hpp |   4 +-
>  backend/src/llvm/llvm_scalarize.cpp   |   1 +
>  backend/src/llvm/llvm_to_gen.cpp      |   6 +-
>  6 files changed, 134 insertions(+), 4 deletions(-)  create mode 100644
> backend/src/llvm/StripAttributes.cpp
> 
> diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt index
> a21918c..a6736ec 100644
> --- a/backend/src/CMakeLists.txt
> +++ b/backend/src/CMakeLists.txt
> @@ -88,6 +88,7 @@ set (GBE_SRC
>      llvm/ExpandUtils.cpp
>      llvm/PromoteIntegers.cpp
>      llvm/ExpandLargeIntegers.cpp
> +    llvm/StripAttributes.cpp
>      llvm/llvm_to_gen.cpp
>      llvm/llvm_loadstore_optimization.cpp
>      llvm/llvm_gen_backend.hpp
> diff --git a/backend/src/llvm/StripAttributes.cpp
> b/backend/src/llvm/StripAttributes.cpp
> new file mode 100644
> index 0000000..05cac17
> --- /dev/null
> +++ b/backend/src/llvm/StripAttributes.cpp
> @@ -0,0 +1,119 @@
> +/*
> + * Copyright © 2012 Intel Corporation
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library. If not, see
> <http://www.gnu.org/licenses/>.
> + *
> + */
> +
> +// Imported from pNaCl project
> +// Copyright (c) 2003-2014 University of Illinois at Urbana-Champaign.
> +// All rights reserved.
> +//
> +// Developed by:
> +//
> +//    LLVM Team
> +//
> +//    University of Illinois at Urbana-Champaign
> +//
> +//    http://llvm.org
> +//
> +// Permission is hereby granted, free of charge, to any person
> +obtaining a copy of // this software and associated documentation files
> +(the "Software"), to deal with // the Software without restriction,
> +including without limitation the rights to // use, copy, modify, merge,
> +publish, distribute, sublicense, and/or sell copies // of the Software,
> +and to permit persons to whom the Software is furnished to do // so,
> subject to the following conditions:
> +//
> +//    * Redistributions of source code must retain the above copyright notice,
> +//      this list of conditions and the following disclaimers.
> +//
> +//   * Redistributions in binary form must reproduce the above copyright
> notice,
> +//      this list of conditions and the following disclaimers in the
> +//      documentation and/or other materials provided with the distribution.
> +//
> +//    * Neither the names of the LLVM Team, University of Illinois at
> +//      Urbana-Champaign, nor the names of its contributors may be used to
> +//      endorse or promote products derived from this Software without
> specific
> +//      prior written permission.
> +//
> +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> +EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
> OF
> +MERCHANTABILITY, FITNESS // FOR A PARTICULAR PURPOSE AND
> +NONINFRINGEMENT.  IN NO EVENT SHALL THE // CONTRIBUTORS OR
> COPYRIGHT
> +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY,
> WHETHER
> +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT
> OF OR
> +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> WITH THE // SOFTWARE.
> +
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open
> +Source // License. See LICENSE.TXT for details.
> +//
> +//===------------------------------------------------------------------
> +----===//
> +//
> +// This pass strips out attributes that are not supported by Beignet.
> +// Currently, this strips out:
> +//
> +//  * Calling conventions from functions and function calls.
> +//
> +
> +#include "llvm/IR/Function.h"
> +#include "llvm/Pass.h"
> +
> +#if LLVM_VERSION_MINOR >= 5
> +#include "llvm/IR/CallSite.h"
> +#else
> +#include "llvm/Support/CallSite.h"
> +#endif
> +
> +#include "llvm_gen_backend.hpp"
> +
> +using namespace llvm;
> +
> +namespace {
> +  class StripAttributes : public FunctionPass {
> +  public:
> +    static char ID; // Pass identification, replacement for typeid
> +    StripAttributes() : FunctionPass(ID) {
> +    }
> +
> +    virtual bool runOnFunction(Function &Func);
> +  };
> +}
> +
> +char StripAttributes::ID = 0;
> +
> +bool StripAttributes::runOnFunction(Function &Func) {
> +  if (!gbe::isKernelFunction(Func))
> +    Func.addFnAttr(Attribute::AlwaysInline);
> +  Func.setCallingConv(CallingConv::C);
> +  Func.setLinkage(GlobalValue::ExternalLinkage);
> +
> +  for (Function::iterator BB = Func.begin(), E = Func.end();
> +       BB != E; ++BB) {
> +    for (BasicBlock::iterator Inst = BB->begin(), E = BB->end();
> +         Inst != E; ++Inst) {
> +      CallSite Call(Inst);
> +      if (Call)
> +        Call.setCallingConv(CallingConv::C);
> +    }
> +  }
> +
> +  return true;
> +}
> +
> +FunctionPass *llvm::createStripAttributesPass() {
> +  return new StripAttributes();
> +}
> diff --git a/backend/src/llvm/llvm_gen_backend.cpp
> b/backend/src/llvm/llvm_gen_backend.cpp
> index 813d0d3..ec79628 100644
> --- a/backend/src/llvm/llvm_gen_backend.cpp
> +++ b/backend/src/llvm/llvm_gen_backend.cpp
> @@ -2791,8 +2791,13 @@ namespace gbe
>          break;
>        case GEN_OCL_PRINTF:
>          break;
> +      case GEN_OCL_NOT_FOUND:
>        default:
> -        GBE_ASSERTM(false, "Function call are not supported yet");
> +        std::cerr << "Caller instruction: " << std::endl;
> +        I.dump();
> +        std::cerr << "Callee function: " << std::endl;
> +        Callee->dump();
> +        GBE_ASSERT(0);
>      };
>    }
> 
> diff --git a/backend/src/llvm/llvm_gen_backend.hpp
> b/backend/src/llvm/llvm_gen_backend.hpp
> index 91a1166..5724917 100644
> --- a/backend/src/llvm/llvm_gen_backend.hpp
> +++ b/backend/src/llvm/llvm_gen_backend.hpp
> @@ -50,6 +50,7 @@ namespace llvm {
>    FunctionPass *createExpandConstantExprPass();
>    FunctionPass *createExpandLargeIntegersPass();
>    FunctionPass *createPromoteIntegersPass();
> +  FunctionPass *createStripAttributesPass();
>    // Copy debug information from Original to New, and return New.
>    template <typename T> T *CopyDebug(T *New, llvm::Instruction *Original)
> {
>      New->setDebugLoc(Original->getDebugLoc());
> @@ -66,6 +67,7 @@ namespace gbe
>    enum OCLInstrinsic {
>  #define DECL_LLVM_GEN_FUNCTION(ID, NAME) GEN_OCL_##ID,  #include
> "llvm_gen_ocl_function.hxx"
> +  GEN_OCL_NOT_FOUND,
>  #undef DECL_LLVM_GEN_FUNCTION
>    };
> 
> @@ -97,7 +99,7 @@ namespace gbe
>        if (it == map.end()) {
>          std::cerr << "Unresolved symbol: " << symbol << std::endl;
>          std::cerr << "Aborting..." << std::endl;
> -        exit(-1);
> +        return GEN_OCL_NOT_FOUND;
>        }
>        return it->second;
>      }
> diff --git a/backend/src/llvm/llvm_scalarize.cpp
> b/backend/src/llvm/llvm_scalarize.cpp
> index 860053f..b657246 100644
> --- a/backend/src/llvm/llvm_scalarize.cpp
> +++ b/backend/src/llvm/llvm_scalarize.cpp
> @@ -643,6 +643,7 @@ namespace gbe {
>          CallSite::arg_iterator CI = CS.arg_begin() + 1;
> 
>          switch (genIntrinsicID) {
> +          case GEN_OCL_NOT_FOUND:
>            default: break;
>            case GEN_OCL_READ_IMAGE_I:
>            case GEN_OCL_READ_IMAGE_UI:
> diff --git a/backend/src/llvm/llvm_to_gen.cpp
> b/backend/src/llvm/llvm_to_gen.cpp
> index 89a22b6..a4ce4a2 100644
> --- a/backend/src/llvm/llvm_to_gen.cpp
> +++ b/backend/src/llvm/llvm_to_gen.cpp
> @@ -133,8 +133,9 @@ namespace gbe
>      MPM.add(createInstructionCombiningPass());// Clean up after IPCP & DAE
>      MPM.add(createCFGSimplificationPass());   // Clean up after IPCP & DAE
>      MPM.add(createPruneEHPass());             // Remove dead EH info
> +    MPM.add(createStripAttributesPass());     // Strip unsupported attributes
> and calling conventions.
>      MPM.add(createBarrierNodupPass(false));   // remove noduplicate fnAttr
> before inlining.
> -    MPM.add(createFunctionInliningPass(200000));
> +    MPM.add(createFunctionInliningPass(20000));
>      MPM.add(createBarrierNodupPass(true));    // restore noduplicate fnAttr
> after inlining.
>      MPM.add(createFunctionAttrsPass());       // Set readonly/readnone attrs
> 
> @@ -275,7 +276,8 @@ namespace gbe
>  #endif
>      // Print the code before further optimizations
>      passes.add(createIntrinsicLoweringPass());
> -    passes.add(createFunctionInliningPass(200000));
> +    passes.add(createStripAttributesPass());     // Strip unsupported
> attributes and calling conventions.
> +    passes.add(createFunctionInliningPass(20000));
>      passes.add(createScalarReplAggregatesPass(64, true, -1, -1, 64));
>      passes.add(createLoadStoreOptimizationPass());
>      passes.add(createConstantPropagationPass());
> --
> 1.9.1
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list