[Mesa-dev] [PATCH 16/20] i965/cfg: Add functions to combine basic blocks.

Pohjolainen, Topi topi.pohjolainen at intel.com
Tue Aug 19 00:53:18 PDT 2014


On Thu, Jul 24, 2014 at 07:54:23PM -0700, Matt Turner wrote:
> ---
>  src/mesa/drivers/dri/i965/brw_cfg.cpp | 59 +++++++++++++++++++++++++++++++++++
>  src/mesa/drivers/dri/i965/brw_cfg.h   |  2 ++
>  2 files changed, 61 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_cfg.cpp b/src/mesa/drivers/dri/i965/brw_cfg.cpp
> index 3895469..a51d0d2 100644
> --- a/src/mesa/drivers/dri/i965/brw_cfg.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_cfg.cpp
> @@ -92,6 +92,65 @@ bblock_t::is_successor_of(const bblock_t *block) const
>     return false;
>  }
>  
> +static bool
> +ends_block(const backend_instruction *inst)
> +{
> +   enum opcode op = inst->opcode;
> +
> +   return op == BRW_OPCODE_IF ||
> +          op == BRW_OPCODE_ELSE ||
> +          op == BRW_OPCODE_CONTINUE ||
> +          op == BRW_OPCODE_BREAK ||
> +          op == BRW_OPCODE_WHILE;
> +}
> +
> +static bool
> +starts_block(const backend_instruction *inst)
> +{
> +   enum opcode op = inst->opcode;
> +
> +   return op == BRW_OPCODE_DO ||
> +          op == BRW_OPCODE_ENDIF;
> +}
> +
> +bool
> +bblock_t::can_combine_with(const bblock_t *that) const
> +{
> +   if ((const bblock_t *)this->link.next != that)
> +      return false;
> +
> +   if (ends_block(this->end) ||
> +       starts_block(that->start))
> +      return false;
> +
> +   return true;
> +}
> +
> +/* If I merge this into that, we'll revisit on foreach_block_safe.
> + *                            we won't on foreach_block.
> + *
> + * If I merge that into this, foreach_block_safe won't work
> + *                            foreach_block will.
> + *

I need some help here as well. Below the logic merges "that" into "this",
right? And the following patch switches to use foreach_block_safe() instead
of foreach_block(). Now, the comment here lets me to believe it shouldn't
work...

> + */
> +void
> +bblock_t::combine_with(bblock_t *that)
> +{
> +   assert(this->can_combine_with(that));
> +   foreach_list_typed (bblock_link, link, link, &this->children) {
> +      assert(link->block == that);
> +   }
> +   foreach_list_typed (bblock_link, link, link, &that->parents) {
> +      assert(link->block == this);
> +   }
> +
> +   this->end_ip = that->end_ip;
> +   this->end = that->end;
> +   this->else_block = that->else_block;
> +
> +   this->cfg->remove_block(that);
> +}
> +
>  void
>  bblock_t::dump(backend_visitor *v)
>  {
> diff --git a/src/mesa/drivers/dri/i965/brw_cfg.h b/src/mesa/drivers/dri/i965/brw_cfg.h
> index 9ffa7da..9f914cc 100644
> --- a/src/mesa/drivers/dri/i965/brw_cfg.h
> +++ b/src/mesa/drivers/dri/i965/brw_cfg.h
> @@ -60,6 +60,8 @@ struct bblock_t {
>     void add_successor(void *mem_ctx, bblock_t *successor);
>     bool is_predecessor_of(const bblock_t *block) const;
>     bool is_successor_of(const bblock_t *block) const;
> +   bool can_combine_with(const bblock_t *that) const;
> +   void combine_with(bblock_t *that);
>     void dump(backend_visitor *v);
>  #endif
>  
> -- 
> 1.8.5.5
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list