summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Bumiller <[email protected]>2010-01-07 21:17:13 +0100
committerChristoph Bumiller <[email protected]>2010-01-07 21:19:58 +0100
commit7fc5fcada5600b401d23a29a4a3d1a09e3492d1c (patch)
tree5d756a64273c123bc716adc4dfefa6b4bbfd0247
parenta009fa430597d6c31b623a3989e95e0812c495e9 (diff)
nv50: preallocate TEMPs written first time in a subroutine
Otherwise we risk overwriting them with temporary GPRs if they're not used immediately after the CALL.
-rw-r--r--src/gallium/drivers/nv50/nv50_program.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/gallium/drivers/nv50/nv50_program.c b/src/gallium/drivers/nv50/nv50_program.c
index b1bac447f22..53f9f0adf31 100644
--- a/src/gallium/drivers/nv50/nv50_program.c
+++ b/src/gallium/drivers/nv50/nv50_program.c
@@ -2911,7 +2911,7 @@ nv50_program_tx_insn(struct nv50_pc *pc,
static void
prep_inspect_insn(struct nv50_pc *pc, const struct tgsi_full_instruction *insn)
{
- struct nv50_reg *reg = NULL;
+ struct nv50_reg *r, *reg = NULL;
const struct tgsi_full_src_register *src;
const struct tgsi_dst_register *dst;
unsigned i, c, k, mask;
@@ -2957,7 +2957,15 @@ prep_inspect_insn(struct nv50_pc *pc, const struct tgsi_full_instruction *insn)
continue;
k = tgsi_util_get_full_src_register_swizzle(src, c);
- reg[src->Register.Index * 4 + k].acc = pc->insn_nr;
+ r = &reg[src->Register.Index * 4 + k];
+
+ /* If used before written, pre-allocate the reg,
+ * lest we overwrite results from a subroutine.
+ */
+ if (!r->acc && r->type == P_TEMP)
+ alloc_reg(pc, r);
+
+ r->acc = pc->insn_nr;
}
}
}