i965/vec4: Drop backend_reg::in_range() in favor of regions_overlap().
authorFrancisco Jerez <currojerez@riseup.net>
Fri, 2 Sep 2016 02:42:40 +0000 (19:42 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 14 Sep 2016 21:50:55 +0000 (14:50 -0700)
This makes sure that overlap checks are done correctly throughout the
back-end when the '*this' register starts before the register/size
pair provided as argument, and is actually less annoying to use than
in_range() at this point since regions_overlap() takes its size
arguments in bytes.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/mesa/drivers/dri/i965/brw_shader.cpp
src/mesa/drivers/dri/i965/brw_shader.h
src/mesa/drivers/dri/i965/brw_vec4.cpp
src/mesa/drivers/dri/i965/brw_vec4_cmod_propagation.cpp
src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp

index e599235a73c96bdccbeb48310b1ea6fb5b40088f..951e6b250de95ed246a1a56d6cfade663183856c 100644 (file)
@@ -744,15 +744,6 @@ backend_reg::is_accumulator() const
    return file == ARF && nr == BRW_ARF_ACCUMULATOR;
 }
 
-bool
-backend_reg::in_range(const backend_reg &r, unsigned n) const
-{
-   return (file == r.file &&
-           nr == r.nr &&
-           offset >= r.offset &&
-           offset < r.offset + n * REG_SIZE);
-}
-
 bool
 backend_instruction::is_commutative() const
 {
index 0de0808651749031eb48db57cbe50e414b7d8f26..ba2404a7eb402fca12571c5f8b2627d1aaa084c9 100644 (file)
@@ -62,7 +62,6 @@ struct backend_reg : private brw_reg
    bool is_negative_one() const;
    bool is_null() const;
    bool is_accumulator() const;
-   bool in_range(const backend_reg &r, unsigned n) const;
 
    /** Offset from the start of the (virtual) register in bytes. */
    uint16_t offset;
index 86245e101bad1993a534a98aa331d934b59600bb..eaf2dd54ffed969b12c25fb103cba1df1eaeb2f6 100644 (file)
@@ -1143,7 +1143,8 @@ vec4_visitor::opt_register_coalesce()
                                                   inst) {
          _scan_inst = scan_inst;
 
-         if (inst->src[0].in_range(scan_inst->dst, DIV_ROUND_UP(scan_inst->size_written, REG_SIZE))) {
+         if (regions_overlap(inst->src[0], inst->size_read(0),
+                             scan_inst->dst, scan_inst->size_written)) {
             /* Found something writing to the reg we want to coalesce away. */
             if (to_mrf) {
                /* SEND instructions can't have MRF as a destination. */
@@ -1197,8 +1198,8 @@ vec4_visitor::opt_register_coalesce()
           */
         bool interfered = false;
         for (int i = 0; i < 3; i++) {
-            if (inst->src[0].in_range(scan_inst->src[i],
-                                      DIV_ROUND_UP(scan_inst->size_read(i), REG_SIZE)))
+            if (regions_overlap(inst->src[0], inst->size_read(0),
+                                scan_inst->src[i], scan_inst->size_read(i)))
               interfered = true;
         }
         if (interfered)
@@ -1207,7 +1208,8 @@ vec4_visitor::opt_register_coalesce()
          /* If somebody else writes the same channels of our destination here,
           * we can't coalesce before that.
           */
-         if (inst->dst.in_range(scan_inst->dst, DIV_ROUND_UP(scan_inst->size_written, REG_SIZE)) &&
+         if (regions_overlap(inst->dst, inst->size_written,
+                             scan_inst->dst, scan_inst->size_written) &&
              (inst->dst.writemask & scan_inst->dst.writemask) != 0) {
             break;
          }
@@ -1223,8 +1225,8 @@ vec4_visitor::opt_register_coalesce()
             }
          } else {
             for (int i = 0; i < 3; i++) {
-               if (inst->dst.in_range(scan_inst->src[i],
-                                      DIV_ROUND_UP(scan_inst->size_read(i), REG_SIZE)))
+               if (regions_overlap(inst->dst, inst->size_written,
+                                   scan_inst->src[i], scan_inst->size_read(i)))
                   interfered = true;
             }
             if (interfered)
index e74bc155fe1f8015d51729661eb8622057d24a8a..99773177cdb9c6dc96b553740df9bc7c033b5064 100644 (file)
@@ -68,8 +68,8 @@ opt_cmod_propagation_local(bblock_t *block)
 
       bool read_flag = false;
       foreach_inst_in_block_reverse_starting_from(vec4_instruction, scan_inst, inst) {
-         if (inst->src[0].in_range(scan_inst->dst,
-                                   DIV_ROUND_UP(scan_inst->size_written, REG_SIZE))) {
+         if (regions_overlap(inst->src[0], inst->size_read(0),
+                             scan_inst->dst, scan_inst->size_written)) {
             if ((scan_inst->predicate && scan_inst->opcode != BRW_OPCODE_SEL) ||
                 scan_inst->dst.offset / REG_SIZE != inst->src[0].offset / REG_SIZE ||
                 (scan_inst->dst.writemask != WRITEMASK_X &&
index 777d2529bb5a0b6b1471faa5ca3217d17b0d69a6..fe76dea79588e57243c2f93f1b21b0ead7e0200e 100644 (file)
@@ -72,8 +72,8 @@ is_channel_updated(vec4_instruction *inst, src_reg *values[4], int ch)
    if (!src || src->file != VGRF)
       return false;
 
-   return (src->in_range(inst->dst, DIV_ROUND_UP(inst->size_written, REG_SIZE)) &&
-           inst->dst.writemask & (1 << BRW_GET_SWZ(src->swizzle, ch)));
+   return regions_overlap(*src, REG_SIZE, inst->dst, inst->size_written) &&
+          inst->dst.writemask & (1 << BRW_GET_SWZ(src->swizzle, ch));
 }
 
 static bool