r300/compiler: Use rc_for_all_reads_src() in "dead constants" pass
authorTom Stellard <tstellar@gmail.com>
Tue, 28 Sep 2010 03:51:05 +0000 (20:51 -0700)
committerTom Stellard <tstellar@gmail.com>
Tue, 28 Sep 2010 06:17:11 +0000 (23:17 -0700)
src/mesa/drivers/dri/r300/compiler/radeon_remove_constants.c

index 7b3468a27eaa63559b68eb637f7835419bd5b3de..c59161640c3c371263f7b1dca5f99f65868d5c29 100644 (file)
 #include "radeon_remove_constants.h"
 #include "radeon_dataflow.h"
 
+struct mark_used_data {
+       unsigned char * const_used;
+       unsigned * has_rel_addr;
+};
+
 static void remap_regs(void * userdata, struct rc_instruction * inst,
                        rc_register_file * pfile, unsigned int * pindex)
 {
@@ -38,6 +43,20 @@ static void remap_regs(void * userdata, struct rc_instruction * inst,
        }
 }
 
+static void mark_used(void * userdata, struct rc_instruction * inst,
+                                               struct rc_src_register * src)
+{
+       struct mark_used_data * d = userdata;
+
+       if (src->File == RC_FILE_CONSTANT) {
+               if (src->RelAddr) {
+                       *d->has_rel_addr = 1;
+               } else {
+                       d->const_used[src->Index] = 1;
+               }
+       }
+}
+
 void rc_remove_unused_constants(struct radeon_compiler *c, void *user)
 {
        unsigned **out_remap_table = (unsigned**)user;
@@ -48,6 +67,7 @@ void rc_remove_unused_constants(struct radeon_compiler *c, void *user)
        unsigned is_identity = 1;
        unsigned are_externals_remapped = 0;
        struct rc_constant *constants = c->Program.Constants.Constants;
+       struct mark_used_data d;
 
        if (!c->Program.Constants.Count) {
                *out_remap_table = NULL;
@@ -57,36 +77,13 @@ void rc_remove_unused_constants(struct radeon_compiler *c, void *user)
        const_used = malloc(c->Program.Constants.Count);
        memset(const_used, 0, c->Program.Constants.Count);
 
+       d.const_used = const_used;
+       d.has_rel_addr = &has_rel_addr;
+
        /* Pass 1: Mark used constants. */
        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);
-
-               /* XXX: This loop and the if statement after it should be
-                * replaced by a call to one of the rc_for_all_reads_* functions.
-                * The reason it does not use one of those functions now is
-                * because none of them have RelAddr as an argument. */
-               for (unsigned i = 0; i < opcode->NumSrcRegs; i++) {
-                       if (inst->U.I.SrcReg[i].File == RC_FILE_CONSTANT) {
-                               if (inst->U.I.SrcReg[i].RelAddr) {
-                                       has_rel_addr = 1;
-                               } else {
-                                       const_used[inst->U.I.SrcReg[i].Index] = 1;
-                               }
-                       }
-               }
-               if (inst->U.I.PreSub.Opcode != RC_PRESUB_NONE) {
-                       unsigned int i;
-                       unsigned int srcp_regs = rc_presubtract_src_reg_count(
-                                                       inst->U.I.PreSub.Opcode);
-                       for( i = 0; i < srcp_regs; i++) {
-                               if (inst->U.I.PreSub.SrcReg[i].File ==
-                                                       RC_FILE_CONSTANT) {
-                                       const_used[
-                                           inst->U.I.PreSub.SrcReg[i].Index] = 1;
-                               }
-                       }
-               }
+               rc_for_all_reads_src(inst, mark_used, &d);
        }
 
        /* Pass 2: If there is relative addressing, mark all externals as used. */