r300/compiler: disable deadcode elimination for indexed dst operands
authorMarek Olšák <maraeo@gmail.com>
Thu, 2 Sep 2010 08:21:23 +0000 (10:21 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sat, 4 Sep 2010 16:56:22 +0000 (18:56 +0200)
src/mesa/drivers/dri/r300/compiler/radeon_dataflow_deadcode.c

index 701092b625e9b6078af95cedec187c83f5f653f5..9d17b4772adc69b6a00d09de4cfcb7a2247391f0 100644 (file)
@@ -220,6 +220,18 @@ void rc_dataflow_deadcode(struct radeon_compiler * c, void *user)
        unsigned has_temp_reladdr_src = 0;
        rc_dataflow_mark_outputs_fn dce = (rc_dataflow_mark_outputs_fn)user;
 
+       /* Give up if there is relative addressing of destination operands. */
+       for(struct rc_instruction * inst = c->Program.Instructions.Next;
+           inst != &c->Program.Instructions;
+           inst = inst->Next) {
+               const struct rc_opcode_info *opcode = rc_get_opcode_info(inst->U.I.Opcode);
+               if (opcode->HasDstReg &&
+                   inst->U.I.DstReg.WriteMask &&
+                   inst->U.I.DstReg.RelAddr) {
+                       return;
+               }
+       }
+
        memset(&s, 0, sizeof(s));
        s.C = c;
 
@@ -316,6 +328,7 @@ void rc_dataflow_deadcode(struct radeon_compiler * c, void *user)
                                                for (struct rc_instruction *ptr = inst->Prev;
                                                     ptr != &c->Program.Instructions;
                                                     ptr = ptr->Prev) {
+                                                       opcode = rc_get_opcode_info(ptr->U.I.Opcode);
                                                        if (opcode->HasDstReg &&
                                                            ptr->U.I.DstReg.File == RC_FILE_TEMPORARY &&
                                                            ptr->U.I.DstReg.WriteMask) {
@@ -327,6 +340,7 @@ void rc_dataflow_deadcode(struct radeon_compiler * c, void *user)
                                                }
 
                                                has_temp_reladdr_src = 1;
+                                               break;
                                        }
                                }
                        }