i965/fs: Drop fs_inst::overwrites_reg() in favor of regions_overlap().
authorFrancisco Jerez <currojerez@riseup.net>
Fri, 2 Sep 2016 02:34:18 +0000 (19:34 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 14 Sep 2016 21:50:55 +0000 (14:50 -0700)
fs_inst::overwrites_reg is rather easy to misuse because it cannot
tell how large the register region starting at 'reg' is, so in cases
where the destination region starts after 'reg' it may give a
misleading result.  regions_overlap() is somewhat more verbose to use
but handles arbitrary overlap correctly so it should generally be used
instead.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs_cmod_propagation.cpp
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
src/mesa/drivers/dri/i965/brw_fs_cse.cpp
src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp
src/mesa/drivers/dri/i965/brw_fs_saturate_propagation.cpp
src/mesa/drivers/dri/i965/brw_ir_fs.h

index f5ae60372f699683a36959518488f501aaa6523f..a52e5a37950ba991b0b7f73574ee906d729800de 100644 (file)
@@ -240,12 +240,6 @@ fs_inst::equals(fs_inst *inst) const
            offset == inst->offset);
 }
 
-bool
-fs_inst::overwrites_reg(const fs_reg &reg) const
-{
-   return reg.in_range(dst, DIV_ROUND_UP(size_written, REG_SIZE));
-}
-
 bool
 fs_inst::is_send_from_grf() const
 {
index 291ae4c24d23a3da0ca976d4c1cabc51db32a5e5..2d50c92e9e303b0bd96feec3e5129b190650b7b5 100644 (file)
@@ -88,7 +88,8 @@ opt_cmod_propagation_local(const gen_device_info *devinfo, bblock_t *block)
 
       bool read_flag = false;
       foreach_inst_in_block_reverse_starting_from(fs_inst, scan_inst, inst) {
-         if (scan_inst->overwrites_reg(inst->src[0])) {
+         if (regions_overlap(scan_inst->dst, scan_inst->size_written,
+                             inst->src[0], inst->size_read(0))) {
             if (scan_inst->is_partial_write() ||
                 scan_inst->dst.offset != inst->src[0].offset ||
                 scan_inst->exec_size != inst->exec_size)
index 4a56aff5bdc313cb47bb7bb95c99326fb589189a..bd534bf65bfaff20b178a22d435d9d02c769bf01 100644 (file)
@@ -161,8 +161,10 @@ fs_copy_prop_dataflow::setup_initial_values()
 
          /* Mark ACP entries which are killed by this instruction. */
          for (int i = 0; i < num_acp; i++) {
-            if (inst->overwrites_reg(acp[i]->dst) ||
-                inst->overwrites_reg(acp[i]->src)) {
+            if (regions_overlap(inst->dst, inst->size_written,
+                                acp[i]->dst, acp[i]->size_written) ||
+                regions_overlap(inst->dst, inst->size_written,
+                                acp[i]->src, acp[i]->size_read)) {
                BITSET_SET(bd[block->num].kill, i);
             }
          }
index 2acbfea71f0b8fda9a6b3db93eee9b52cb47c2d3..48220efd73040bad690afb28038319aebaafccfd 100644 (file)
@@ -335,7 +335,9 @@ fs_visitor::opt_cse_local(bblock_t *block)
             /* Kill all AEB entries that use the destination we just
              * overwrote.
              */
-            if (inst->overwrites_reg(entry->generator->src[i])) {
+            if (regions_overlap(inst->dst, inst->size_written,
+                                entry->generator->src[i],
+                                entry->generator->size_read(i))) {
                entry->remove();
                ralloc_free(entry);
                break;
index 694cc0b0dd498b6ea343ec250ae913f3f7e71d4a..f56f05b7e9b5607e720cde6e54a3471ceb9daf0d 100644 (file)
@@ -138,8 +138,10 @@ can_coalesce_vars(brw::fs_live_variables *live_intervals,
          if (scan_ip > end_ip)
             return true; /* registers do not interfere */
 
-         if (scan_inst->overwrites_reg(inst->dst) ||
-             scan_inst->overwrites_reg(inst->src[0]))
+         if (regions_overlap(scan_inst->dst, scan_inst->size_written,
+                             inst->dst, inst->size_written) ||
+             regions_overlap(scan_inst->dst, scan_inst->size_written,
+                             inst->src[0], inst->size_read(0)))
             return false; /* registers interfere */
       }
    }
index 60bb1c049ca159fac1098f4c8477b69fd8e45d70..1c97a507d8cd40c968b1e972274cc20317dc1bf6 100644 (file)
@@ -64,7 +64,8 @@ opt_saturate_propagation_local(fs_visitor *v, bblock_t *block)
 
       bool interfered = false;
       foreach_inst_in_block_reverse_starting_from(fs_inst, scan_inst, inst) {
-         if (scan_inst->overwrites_reg(inst->src[0])) {
+         if (regions_overlap(scan_inst->dst, scan_inst->size_written,
+                             inst->src[0], inst->size_read(0))) {
             if (scan_inst->is_partial_write() ||
                 (scan_inst->dst.type != inst->dst.type &&
                  !scan_inst->can_change_types()))
index c688345fdfda5fabdfeb130b39b5ed1299017134..5275953363baf7f9fdb1b06b0cd68562656e3b6e 100644 (file)
@@ -334,7 +334,6 @@ public:
    void resize_sources(uint8_t num_sources);
 
    bool equals(fs_inst *inst) const;
-   bool overwrites_reg(const fs_reg &reg) const;
    bool is_send_from_grf() const;
    bool is_partial_write() const;
    bool is_copy_payload(const brw::simple_allocator &grf_alloc) const;