Mesa (master): i965/cfg: Make DO instruction begin a basic block.
Matt Turner
mattst88 at kemper.freedesktop.org
Sun May 25 06:02:28 UTC 2014
Module: Mesa
Branch: master
Commit: dd0e1c3aff0193bc130161e6f4d13042a7d83bae
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dd0e1c3aff0193bc130161e6f4d13042a7d83bae
Author: Matt Turner <mattst88 at gmail.com>
Date: Sat May 17 11:53:45 2014 -0700
i965/cfg: Make DO instruction begin a basic block.
The DO instruction doesn't exist on Gen6+. Since before this commit, DO
always ended a basic block, if it also happened to start one (e.g., a
while loop inside an if statement) the block containing only the DO
would actually contain no hardware instructions.
Pre-Gen6's WHILE instructions jumps to the instruction following the DO,
so strictly speaking we won't be modeling that properly, but I claim
there is actually no functional difference.
This will simplify an upcoming change where we want to mark the first
hardware instruction in the loop as beginning a block, and the last
instruction before the loop as ending one.
Reviewed-by: Eric Anholt <eric at anholt.net>
---
src/mesa/drivers/dri/i965/brw_cfg.cpp | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_cfg.cpp b/src/mesa/drivers/dri/i965/brw_cfg.cpp
index a806714..6bf99f1 100644
--- a/src/mesa/drivers/dri/i965/brw_cfg.cpp
+++ b/src/mesa/drivers/dri/i965/brw_cfg.cpp
@@ -98,7 +98,7 @@ cfg_t::cfg_t(exec_list *instructions)
bblock_t *cur_if = NULL; /**< BB ending with IF. */
bblock_t *cur_else = NULL; /**< BB ending with ELSE. */
bblock_t *cur_endif = NULL; /**< BB starting with ENDIF. */
- bblock_t *cur_do = NULL; /**< BB ending with DO. */
+ bblock_t *cur_do = NULL; /**< BB starting with DO. */
bblock_t *cur_while = NULL; /**< BB immediately following WHILE. */
exec_list if_stack, else_stack, do_stack, while_stack;
bblock_t *next;
@@ -205,15 +205,18 @@ cfg_t::cfg_t(exec_list *instructions)
*/
cur_while = new_block();
- /* Set up our immediately following block, full of "then"
- * instructions.
- */
- next = new_block();
- next->start = (backend_instruction *)inst->next;
- cur->add_successor(mem_ctx, next);
- cur_do = next;
+ if (cur->start == inst) {
+ /* New block was just created; use it. */
+ cur_do = cur;
+ } else {
+ cur_do = new_block();
+ cur_do->start = inst;
- set_next_block(&cur, next, ip);
+ cur->end = (backend_instruction *)inst->prev;
+ cur->add_successor(mem_ctx, cur_do);
+
+ set_next_block(&cur, cur_do, ip - 1);
+ }
break;
case BRW_OPCODE_CONTINUE:
More information about the mesa-commit
mailing list