i965/fs: Allow spilling of non-contiguous registers.
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 27 Apr 2016 09:07:08 +0000 (02:07 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Mon, 23 May 2016 21:05:21 +0000 (14:05 -0700)
This should be working fine now.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94997
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp

index 874013e57b5a5104d4e490a9dd86d1da40e019fb..e770a7f91cca6987e9aba07ebad4ada841e9499e 100644 (file)
@@ -835,30 +835,13 @@ fs_visitor::choose_spill_reg(struct ra_graph *g)
     */
    foreach_block_and_inst(block, fs_inst, inst, cfg) {
       for (unsigned int i = 0; i < inst->sources; i++) {
-        if (inst->src[i].file == VGRF) {
+        if (inst->src[i].file == VGRF)
             spill_costs[inst->src[i].nr] += loop_scale;
-
-            /* Register spilling logic assumes full-width registers; smeared
-             * registers have a width of 1 so if we try to spill them we'll
-             * generate invalid assembly.  This shouldn't be a problem because
-             * smeared registers are only used as short-term temporaries when
-             * loading pull constants, so spilling them is unlikely to reduce
-             * register pressure anyhow.
-             */
-            if (!inst->src[i].is_contiguous()) {
-               no_spill[inst->src[i].nr] = true;
-            }
-        }
       }
 
-      if (inst->dst.file == VGRF) {
+      if (inst->dst.file == VGRF)
          spill_costs[inst->dst.nr] += inst->regs_written * loop_scale;
 
-         if (!inst->dst.is_contiguous()) {
-            no_spill[inst->dst.nr] = true;
-         }
-      }
-
       switch (inst->opcode) {
 
       case BRW_OPCODE_DO: