Mesa (master): nv50,nvc0: don' t insert instructions after the block terminator
Christoph Bumiller
chrisbmr at kemper.freedesktop.org
Sun Apr 10 12:07:43 UTC 2011
Module: Mesa
Branch: master
Commit: ee2a8ea7d9004c052916db79eac644ef51a9ccaa
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ee2a8ea7d9004c052916db79eac644ef51a9ccaa
Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date: Fri Apr 8 15:51:48 2011 +0200
nv50,nvc0: don't insert instructions after the block terminator
---
src/gallium/drivers/nv50/nv50_pc.c | 3 +++
src/gallium/drivers/nv50/nv50_pc_regalloc.c | 4 +++-
src/gallium/drivers/nv50/nv50_tgsi_to_nc.c | 12 +++++++++---
src/gallium/drivers/nvc0/nvc0_pc_regalloc.c | 4 +++-
src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c | 9 +++++++--
5 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/src/gallium/drivers/nv50/nv50_pc.c b/src/gallium/drivers/nv50/nv50_pc.c
index f6870cc..4fe13a7 100644
--- a/src/gallium/drivers/nv50/nv50_pc.c
+++ b/src/gallium/drivers/nv50/nv50_pc.c
@@ -625,6 +625,9 @@ nvbb_insert_tail(struct nv_basic_block *b, struct nv_instruction *i)
i->bb = b;
b->num_instructions++;
+
+ if (i->prev && i->prev->is_terminator)
+ nv_nvi_permute(i->prev, i);
}
void
diff --git a/src/gallium/drivers/nv50/nv50_pc_regalloc.c b/src/gallium/drivers/nv50/nv50_pc_regalloc.c
index df3ac54..e4f418a 100644
--- a/src/gallium/drivers/nv50/nv50_pc_regalloc.c
+++ b/src/gallium/drivers/nv50/nv50_pc_regalloc.c
@@ -516,7 +516,9 @@ pass_generate_phi_movs(struct nv_pc_pass *ctx, struct nv_basic_block *b)
}
if (pn != p && pn->exit) {
- ctx->pc->current_block = b->in[n ? 0 : 1];
+ assert(!b->in[!n]->exit || b->in[!n]->exit->is_terminator);
+ /* insert terminator (branch to ENDIF) in new else block */
+ ctx->pc->current_block = pn;
ni = new_instruction(ctx->pc, NV_OP_BRA);
ni->target = b;
ni->is_terminator = 1;
diff --git a/src/gallium/drivers/nv50/nv50_tgsi_to_nc.c b/src/gallium/drivers/nv50/nv50_tgsi_to_nc.c
index 1449cb0..f548836 100644
--- a/src/gallium/drivers/nv50/nv50_tgsi_to_nc.c
+++ b/src/gallium/drivers/nv50/nv50_tgsi_to_nc.c
@@ -273,6 +273,12 @@ fetch_by_bb(struct bld_value_stack *stack,
fetch_by_bb(stack, vals, n, b->in[i]);
}
+static INLINE boolean
+nvbb_is_terminated(struct nv_basic_block *bb)
+{
+ return bb->exit && bb->exit->is_terminator;
+}
+
static INLINE struct nv_value *
bld_load_imm_u32(struct bld_context *bld, uint32_t u);
@@ -1727,8 +1733,7 @@ bld_instruction(struct bld_context *bld,
{
struct nv_basic_block *b = new_basic_block(bld->pc);
- if (bld->pc->current_block->exit &&
- !bld->pc->current_block->exit->is_terminator)
+ if (!nvbb_is_terminated(bld->pc->current_block))
bld_flow(bld, NV_OP_BRA, NV_CC_TR, NULL, b, FALSE);
--bld->cond_lvl;
@@ -1800,7 +1805,8 @@ bld_instruction(struct bld_context *bld,
{
struct nv_basic_block *bb = bld->loop_bb[bld->loop_lvl - 1];
- bld_flow(bld, NV_OP_BRA, NV_CC_TR, NULL, bb, FALSE);
+ if (!nvbb_is_terminated(bld->pc->current_block))
+ bld_flow(bld, NV_OP_BRA, NV_CC_TR, NULL, bb, FALSE);
nvbb_attach_block(bld->pc->current_block, bb, CFG_EDGE_BACK);
diff --git a/src/gallium/drivers/nvc0/nvc0_pc_regalloc.c b/src/gallium/drivers/nvc0/nvc0_pc_regalloc.c
index f4afe08..0515a0d 100644
--- a/src/gallium/drivers/nvc0/nvc0_pc_regalloc.c
+++ b/src/gallium/drivers/nvc0/nvc0_pc_regalloc.c
@@ -504,7 +504,9 @@ pass_generate_phi_movs(struct nv_pc_pass *ctx, struct nv_basic_block *b)
}
if (pn != p && pn->exit) {
- ctx->pc->current_block = b->in[n ? 0 : 1];
+ assert(!b->in[!n]->exit || b->in[!n]->exit->terminator);
+ /* insert terminator (branch to ENDIF) in new else block */
+ ctx->pc->current_block = pn;
ni = new_instruction(ctx->pc, NV_OP_BRA);
ni->target = b;
ni->terminator = 1;
diff --git a/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c b/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c
index a44d330..53fd7e7 100644
--- a/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c
+++ b/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c
@@ -259,6 +259,12 @@ fetch_by_bb(struct bld_register *reg,
fetch_by_bb(reg, vals, n, b->in[i]);
}
+static INLINE boolean
+nvc0_bblock_is_terminated(struct nv_basic_block *bb)
+{
+ return bb->exit && bb->exit->terminator;
+}
+
static INLINE struct nv_value *
bld_load_imm_u32(struct bld_context *bld, uint32_t u);
@@ -1637,8 +1643,7 @@ bld_instruction(struct bld_context *bld,
{
struct nv_basic_block *b = new_basic_block(bld->pc);
- if (bld->pc->current_block->exit &&
- !bld->pc->current_block->exit->terminator)
+ if (!nvc0_bblock_is_terminated(bld->pc->current_block))
bld_flow(bld, NV_OP_BRA, NULL, NV_CC_P, b, FALSE);
--bld->cond_lvl;
More information about the mesa-commit
mailing list