[Beignet] [PATCH 2/3] add basic structure for selection IR optimization

Yang, Rong R rong.r.yang at intel.com
Thu Oct 8 01:07:04 PDT 2015


The patch LGTM.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Guo Yejun
> Sent: Monday, September 7, 2015 5:27
> To: beignet at lists.freedesktop.org
> Cc: Guo, Yejun
> Subject: [Beignet] [PATCH 2/3] add basic structure for selection IR
> optimization
> 
> The idea is that many optimzations can be done at selection IR level, which is
> nearly ISA-like *before* physical register allocation. The optimization here
> can help to reduce register use/spill.
> 
> It is hard to do the optimzation in late ASM stage since the ASM instructions
> are encoded without structured information in current implementation. It is
> also not good to move the optimization to early stage, we'll lose much
> optimization opportunity in early stage.
> 
> The idea expects that selection IR is almost ISA-like, trying to avoid
> optimization opportunity lose as far as possible. It means that we'd better do
> as much as possible at selection IR stage, instead of ASM generation stage.
> We can go in this direction in future development.
> 
> From implementation perspective, since the class gbe::Selection is already
> heavy, add new classes in new .cpp file to decouple them.
> 
> There are two levels of optimization, basic block level and global level. The
> peephole optimization such as local copy propagation can be done at basic
> block level, the dead code elimination can be done at global level. We can
> introduce more optimizations here.
> 
> The optimization can be controlled by env variable OCL_OPTIMIZE_SEL_IR
> 
> Signed-off-by: Guo Yejun <yejun.guo at intel.com>
> ---
>  backend/src/CMakeLists.txt                         |  1 +
>  backend/src/backend/gen_context.cpp                |  3 +
>  backend/src/backend/gen_insn_selection.cpp         |  1 +
>  backend/src/backend/gen_insn_selection.hpp         |  5 ++
>  .../src/backend/gen_insn_selection_optimize.cpp    | 67
> ++++++++++++++++++++++
>  5 files changed, 77 insertions(+)
>  create mode 100644
> backend/src/backend/gen_insn_selection_optimize.cpp
> 
> diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt index
> ef95910..f26cc8b 100644
> --- a/backend/src/CMakeLists.txt
> +++ b/backend/src/CMakeLists.txt
> @@ -99,6 +99,7 @@ set (GBE_SRC
>      backend/gen/gen_mesa_disasm.c
>      backend/gen_insn_selection.cpp
>      backend/gen_insn_selection.hpp
> +    backend/gen_insn_selection_optimize.cpp
>      backend/gen_insn_scheduling.cpp
>      backend/gen_insn_scheduling.hpp
>      backend/gen_insn_selection_output.cpp
> diff --git a/backend/src/backend/gen_context.cpp
> b/backend/src/backend/gen_context.cpp
> index 075307d..a71941f 100644
> --- a/backend/src/backend/gen_context.cpp
> +++ b/backend/src/backend/gen_context.cpp
> @@ -2300,10 +2300,13 @@ namespace gbe
>    }
> 
>    BVAR(OCL_OUTPUT_SEL_IR, false);
> +  BVAR(OCL_OPTIMIZE_SEL_IR, true);
>    bool GenContext::emitCode(void) {
>      GenKernel *genKernel = static_cast<GenKernel*>(this->kernel);
>      buildPatchList();
>      sel->select();
> +    if (OCL_OPTIMIZE_SEL_IR)
> +      sel->optimize();
>      if (OCL_OUTPUT_SEL_IR)
>        outputSelectionIR(*this, this->sel);
>      schedulePreRegAllocation(*this, *this->sel); diff --git
> a/backend/src/backend/gen_insn_selection.cpp
> b/backend/src/backend/gen_insn_selection.cpp
> index ab00269..ecd071e 100644
> --- a/backend/src/backend/gen_insn_selection.cpp
> +++ b/backend/src/backend/gen_insn_selection.cpp
> @@ -2067,6 +2067,7 @@ namespace gbe
>      this->blockList = NULL;
>      this->opaque = GBE_NEW(Selection::Opaque, ctx);
>      this->opaque->setSlowByteGather(true);
> +    opt_features = 0;
>    }
> 
>    Selection75::Selection75(GenContext &ctx) : Selection(ctx) { diff --git
> a/backend/src/backend/gen_insn_selection.hpp
> b/backend/src/backend/gen_insn_selection.hpp
> index ffc79e1..86542b0 100644
> --- a/backend/src/backend/gen_insn_selection.hpp
> +++ b/backend/src/backend/gen_insn_selection.hpp
> @@ -266,6 +266,11 @@ namespace gbe
>      class Opaque;
>      /*! Created and destroyed in cpp */
>      Opaque *opaque;
> +
> +    /* optimize at selection IR level */
> +    void optimize(void);
> +    uint32_t opt_features;
> +
>      /*! Use custom allocators */
>      GBE_CLASS(Selection);
>    };
> diff --git a/backend/src/backend/gen_insn_selection_optimize.cpp
> b/backend/src/backend/gen_insn_selection_optimize.cpp
> new file mode 100644
> index 0000000..c82fbe5
> --- /dev/null
> +++ b/backend/src/backend/gen_insn_selection_optimize.cpp
> @@ -0,0 +1,67 @@
> +
> +#include "backend/gen_insn_selection.hpp"
> +#include "backend/gen_context.hpp"
> +#include "ir/function.hpp"
> +#include "ir/liveness.hpp"
> +#include "ir/profile.hpp"
> +#include "sys/cvar.hpp"
> +#include "sys/vector.hpp"
> +#include <algorithm>
> +#include <climits>
> +#include <map>
> +
> +namespace gbe
> +{
> +
> +  class SelOptimizer
> +  {
> +  public:
> +    SelOptimizer(uint32_t features) : features(features) {}
> +    virtual void run() = 0;
> +    virtual ~SelOptimizer() {}
> +  protected:
> +    uint32_t features;
> +  };
> +
> +  class SelBasicBlockOptimizer : public SelOptimizer  {
> +  public:
> +    SelBasicBlockOptimizer(uint32_t features, SelectionBlock &bb) :
> SelOptimizer(features), bb(bb) {}
> +    ~SelBasicBlockOptimizer() {}
> +    virtual void run();
> +
> +  private:
> +    SelectionBlock &bb;
> +    static const size_t MaxTries = 1;   //the times for optimization
> +  };
> +
> +  void SelBasicBlockOptimizer::run()
> +  {
> +
> +  }
> +
> +  class SelGlobalOptimizer : public SelOptimizer  {
> +  public:
> +    SelGlobalOptimizer(uint32_t features) : SelOptimizer(features) {}
> +    ~SelGlobalOptimizer() {}
> +    virtual void run();
> +  };
> +
> +  void SelGlobalOptimizer::run()
> +  {
> +
> +  }
> +
> +  void Selection::optimize()
> +  {
> +    //do basic block level optimization
> +    for (SelectionBlock &block : *blockList) {
> +      SelBasicBlockOptimizer bbopt(opt_features, block);
> +      bbopt.run();
> +    }
> +
> +    //do global optimization
> +
> +  }
> +} /* namespace gbe */
> --
> 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