[Beignet] [PATCH 01/18] GBE: Add a new pass to handle barrier function's noduplicate attribute correctly.
Gong, Zhigang
zhigang.gong at intel.com
Wed Apr 2 01:50:31 PDT 2014
> -----Original Message-----
> From: Yang, Rong R
> Sent: Wednesday, April 2, 2014 4:30 PM
> To: Gong, Zhigang; beignet at lists.freedesktop.org
> Cc: Gong, Zhigang
> Subject: RE: [Beignet] [PATCH 01/18] GBE: Add a new pass to handle barrier
> function's noduplicate attribute correctly.
>
> One comment.
>
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Zhigang Gong
> Sent: Friday, March 28, 2014 3:11 PM
> To: beignet at lists.freedesktop.org
> Cc: Gong, Zhigang
> Subject: [Beignet] [PATCH 01/18] GBE: Add a new pass to handle barrier
> function's noduplicate attribute correctly.
>
> This pass is to remove or add noduplicate function attribute for barrier
> functions.
> Basically, we want to set NoDuplicate for those __gen_barrier_xxx functions.
> But if a sub function calls those barrier functions, the sub function will not be
> inlined in llvm's inlining pass. This is what we don't want. As inlining such a
> function in the caller is safe, we just don't want it to duplicate the call. So
> Introduce this pass to remove the NoDuplicate function attribute before the
> inlining pass and restore it after.
>
> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
> ---
> backend/src/CMakeLists.txt | 1 +
> backend/src/llvm/llvm_barrier_nodup.cpp | 114
> ++++++++++++++++++++++++++++++++
> backend/src/llvm/llvm_gen_backend.hpp | 2 +
> backend/src/llvm/llvm_to_gen.cpp | 2 +
> backend/src/ocl_barrier.ll | 6 +-
> 5 files changed, 122 insertions(+), 3 deletions(-) create mode 100644
> backend/src/llvm/llvm_barrier_nodup.cpp
>
> diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt index
> 6e37d95..d6f2d3c 100644
> --- a/backend/src/CMakeLists.txt
> +++ b/backend/src/CMakeLists.txt
> @@ -144,6 +144,7 @@ else (GBE_USE_BLOB)
> llvm/llvm_passes.cpp
> llvm/llvm_scalarize.cpp
> llvm/llvm_intrinsic_lowering.cpp
> + llvm/llvm_barrier_nodup.cpp
> llvm/llvm_to_gen.cpp
> llvm/llvm_gen_backend.hpp
> llvm/llvm_gen_ocl_function.hxx
> diff --git a/backend/src/llvm/llvm_barrier_nodup.cpp
> b/backend/src/llvm/llvm_barrier_nodup.cpp
> new file mode 100644
> index 0000000..4711610
> --- /dev/null
> +++ b/backend/src/llvm/llvm_barrier_nodup.cpp
> @@ -0,0 +1,114 @@
> +/*
> + * 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 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/>.
> + */
> +
> +/**
> + * \file llvm_barrier_nodup.cpp
> + *
> + * This pass is to remove or add noduplicate function attribute for barrier
> functions.
> + * Basically, we want to set NoDuplicate for those __gen_barrier_xxx
> +functions. But if
> + * a sub function calls those barrier functions, the sub function will
> +not be inlined
> + * in llvm's inlining pass. This is what we don't want. As inlining
> +such a function in
> + * the caller is safe, we just don't want it to duplicate the call. So
> +Introduce this
> + * pass to remove the NoDuplicate function attribute before the
> +inlining pass and restore
> + * it after.
> + *
> + */
> +
> +#include "llvm/Config/config.h"
> +#if LLVM_VERSION_MINOR <= 2
> +#include "llvm/Function.h"
> +#include "llvm/InstrTypes.h"
> +#include "llvm/Instructions.h"
> +#include "llvm/IntrinsicInst.h"
> +#include "llvm/Module.h"
> +#else
> +#include "llvm/IR/Function.h"
> +#include "llvm/IR/InstrTypes.h"
> +#include "llvm/IR/Instructions.h"
> +#include "llvm/IR/IntrinsicInst.h"
> +#include "llvm/IR/Module.h"
> +#endif /* LLVM_VERSION_MINOR <= 2 */
> +#include "llvm/Pass.h"
> +#if LLVM_VERSION_MINOR <= 1
> +#include "llvm/Support/IRBuilder.h"
> +#elif LLVM_VERSION_MINOR == 2
> +#include "llvm/IRBuilder.h"
> +#else
> +#include "llvm/IR/IRBuilder.h"
> +#endif /* LLVM_VERSION_MINOR <= 1 */
> +#include "llvm/Support/CallSite.h"
> +#include "llvm/Support/CFG.h"
> +#include "llvm/Support/raw_ostream.h"
> +#include "llvm/IR/Attributes.h"
> +
> +#include "llvm/llvm_gen_backend.hpp"
> +#include "sys/map.hpp"
> +
> +
> +using namespace llvm;
> +
> +namespace gbe {
> + class BarrierNodup : public ModulePass
> + {
> + public:
> + static char ID;
> + BarrierNodup(bool nodup) :
> + ModulePass(ID), nodup(nodup) {}
> +
> + void getAnalysisUsage(AnalysisUsage &AU) const {
> +
> + }
> +
> + virtual const char *getPassName() const {
> + return "SPIR backend: set barrier no duplicate attr";
> + }
> +
> + virtual bool runOnModule(Module &M)
> + {
> + using namespace llvm;
> + bool changed = false;
> + for (auto &F : M) {
> + if (F.getName() == "__gen_ocl_barrier_local_and_global" ||
> + F.getName() == "__gen_ocl_barrier_local" ||
> + F.getName() == "__gen_ocl_barrier_global") {
> + if (nodup)
> + F.addFnAttr(Attribute::NoDuplicate);
>
> >>>>>>>>>> Also need set changed to true here?
Right, we should set the changed to true as well. Thanks.
>
>
> + else {
> + if (F.hasFnAttribute(Attribute::NoDuplicate)) {
> + auto attrs = F.getAttributes();
> + F.setAttributes(attrs.removeAttribute(M.getContext(),
> + AttributeSet::FunctionIndex,
> + Attribute::NoDuplicate));
> + changed = true;
> + }
> + }
> + }
> + }
> +
> + return changed;
> + }
> + private:
> + bool nodup;
> + };
> +
> +
> + ModulePass *createBarrierNodupPass(bool Nodup) {
> + return new BarrierNodup(Nodup);
> + }
> +
> + char BarrierNodup::ID = 0;
> +} // end namespace
> diff --git a/backend/src/llvm/llvm_gen_backend.hpp
> b/backend/src/llvm/llvm_gen_backend.hpp
> index 389d5f3..56dd27f 100644
> --- a/backend/src/llvm/llvm_gen_backend.hpp
> +++ b/backend/src/llvm/llvm_gen_backend.hpp
> @@ -86,6 +86,8 @@ namespace gbe
>
> /*! Scalarize all vector op instructions */
> llvm::FunctionPass* createScalarizePass();
> + /*! Remove/add NoDuplicate function attribute for barrier functions.
> + */
> + llvm::ModulePass* createBarrierNodupPass(bool);
>
> /*! Convert the Intrinsic call to gen function */
> llvm::BasicBlockPass *createIntrinsicLoweringPass(); diff --git
> a/backend/src/llvm/llvm_to_gen.cpp b/backend/src/llvm/llvm_to_gen.cpp
> index 9e18a57..4d064a2 100644
> --- a/backend/src/llvm/llvm_to_gen.cpp
> +++ b/backend/src/llvm/llvm_to_gen.cpp
> @@ -112,7 +112,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(createBarrierNodupPass(false)); // remove noduplicate
> fnAttr before inlining.
> MPM.add(createFunctionInliningPass(200000));
> + MPM.add(createBarrierNodupPass(true)); // restore noduplicate
> fnAttr after inlining.
> MPM.add(createFunctionAttrsPass()); // Set readonly/readnone
> attrs
>
> //MPM.add(createScalarReplAggregatesPass(64, true, -1, -1, 64)) diff
> --git a/backend/src/ocl_barrier.ll b/backend/src/ocl_barrier.ll index
> 9f46347..4e55fcb 100644
> --- a/backend/src/ocl_barrier.ll
> +++ b/backend/src/ocl_barrier.ll
> @@ -6,9 +6,9 @@
>
> declare i32 @_get_local_mem_fence() nounwind alwaysinline declare i32
> @_get_global_mem_fence() nounwind alwaysinline -declare void
> @__gen_ocl_barrier_local() nounwind alwaysinline -declare void
> @__gen_ocl_barrier_global() nounwind alwaysinline -declare void
> @__gen_ocl_barrier_local_and_global() nounwind alwaysinline
> +declare void @__gen_ocl_barrier_local() nounwind alwaysinline
> +noduplicate declare void @__gen_ocl_barrier_global() nounwind
> +alwaysinline noduplicate declare void
> + at __gen_ocl_barrier_local_and_global() nounwind alwaysinline noduplicate
>
> define void @barrier(i32 %flags) nounwind noduplicate alwaysinline {
> %1 = icmp eq i32 %flags, 3
> --
> 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