mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-07 15:10:12 +01:00
nv50,nvc0: don't insert instructions after the block terminator
This commit is contained in:
parent
d27ff8c5cd
commit
ee2a8ea7d9
5 changed files with 25 additions and 7 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue