[Mesa-dev] [PATCH 11/20] i965/fs: Make count_to_loop_end() use basic blocks.

Pohjolainen, Topi topi.pohjolainen at intel.com
Mon Sep 8 06:25:13 PDT 2014


On Tue, Sep 02, 2014 at 09:34:22PM -0700, Matt Turner wrote:
> When the instructions aren't in a flat list, this wouldn't have worked.
> Also, this should be faster.
> ---
>  src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp | 28 +++++++++++------------
>  1 file changed, 13 insertions(+), 15 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
> index 88f394d..7e391ea 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
> @@ -190,27 +190,25 @@ brw_fs_alloc_reg_sets(struct intel_screen *screen)
>     brw_alloc_reg_set(screen, 2);
>  }
>  
> -int
> -count_to_loop_end(fs_inst *do_inst)
> +static int
> +count_to_loop_end(bblock_t *block)

Could be constant, and naturally below in the loop also. With that:

Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>

I would probably change the name also, it isn't really counting the
instructions anymore (maybe find_loop_end()). But I leave it to you.

>  {
>     int depth = 1;
> -   int ip = 1;
> -   for (fs_inst *inst = (fs_inst *)do_inst->next;
> +   /* Skip the first block, since we don't want to count the do the calling
> +    * function found.
> +    */
> +   for (block = (bblock_t *)block->link.next;
>          depth > 0;
> -        inst = (fs_inst *)inst->next) {
> -      switch (inst->opcode) {
> -      case BRW_OPCODE_DO:
> +        block = (bblock_t *)block->link.next) {
> +      if (block->start->opcode == BRW_OPCODE_DO)
>           depth++;
> -         break;
> -      case BRW_OPCODE_WHILE:
> +      if (block->end->opcode == BRW_OPCODE_WHILE) {
>           depth--;
> -         break;
> -      default:
> -         break;
> +         if (depth == 0)
> +            return block->end_ip;
>        }
> -      ip++;
>     }
> -   return ip;
> +   unreachable("not reached");
>  }
>  
>  /**
> @@ -253,7 +251,7 @@ fs_visitor::setup_payload_interference(struct ra_graph *g,
>            * the end now.
>            */
>           if (loop_depth == 1)
> -            loop_end_ip = ip + count_to_loop_end(inst);
> +            loop_end_ip = count_to_loop_end(block);
>           break;
>        case BRW_OPCODE_WHILE:
>           loop_depth--;
> -- 
> 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