r300/compiler: Fix bug in rc_find_free_temporary
authorNicolai Hähnle <nhaehnle@gmail.com>
Wed, 26 Aug 2009 20:53:24 +0000 (22:53 +0200)
committerNicolai Hähnle <nhaehnle@gmail.com>
Wed, 26 Aug 2009 23:46:45 +0000 (01:46 +0200)
Find used temporaries even if they are only written to in dead code.
This fixes a bug in the NQSSADCE stage.

Signed-off-by: Nicolai Hähnle <nhaehnle@gmail.com>
src/mesa/drivers/dri/r300/compiler/radeon_program.c

index 208d3b90c83fcf33741a91c93781ca85415f7d17..bbbf0dd776832b2212849a630974c9664377b3a5 100644 (file)
@@ -79,13 +79,19 @@ GLint rc_find_free_temporary(struct radeon_compiler * c)
 
        for (struct rc_instruction * rcinst = c->Program.Instructions.Next; rcinst != &c->Program.Instructions; rcinst = rcinst->Next) {
                const struct prog_instruction *inst = &rcinst->I;
-               const GLuint n = _mesa_num_inst_src_regs(inst->Opcode);
+               const GLuint nsrc = _mesa_num_inst_src_regs(inst->Opcode);
+               const GLuint ndst = _mesa_num_inst_dst_regs(inst->Opcode);
                GLuint k;
 
-               for (k = 0; k < n; k++) {
+               for (k = 0; k < nsrc; k++) {
                        if (inst->SrcReg[k].File == PROGRAM_TEMPORARY)
                                used[inst->SrcReg[k].Index] = GL_TRUE;
                }
+
+               if (ndst) {
+                       if (inst->DstReg.File == PROGRAM_TEMPORARY)
+                               used[inst->DstReg.Index] = GL_TRUE;
+               }
        }
 
        for (i = 0; i < MAX_PROGRAM_TEMPS; i++) {