intel/compiler: Update block IPs once in opt_cmod_propagation
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 29 Jun 2021 03:53:22 +0000 (20:53 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 14 Jul 2021 16:57:06 +0000 (09:57 -0700)
No difference proven at 95.0% confidence (n=10) in
dEQP-VK.ssbo.phys.layout.random.16bit.scalar.13.

v2: Only update each block's IP data once instead of once per block.
Suggested by Emma.

Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11632>

src/intel/compiler/brw_fs_cmod_propagation.cpp

index 63e25d3..435186c 100644 (file)
@@ -135,7 +135,7 @@ cmod_propagate_cmp_to_add(const intel_device_info *devinfo, bblock_t *block,
              ((!read_flag && scan_inst->conditional_mod == BRW_CONDITIONAL_NONE) ||
               scan_inst->conditional_mod == cond)) {
             scan_inst->conditional_mod = cond;
-            inst->remove(block);
+            inst->remove(block, true);
             return true;
          }
          break;
@@ -203,7 +203,7 @@ cmod_propagate_not(const intel_device_info *devinfo, bblock_t *block,
              ((!read_flag && scan_inst->conditional_mod == BRW_CONDITIONAL_NONE) ||
               scan_inst->conditional_mod == cond)) {
             scan_inst->conditional_mod = cond;
-            inst->remove(block);
+            inst->remove(block, true);
             return true;
          }
          break;
@@ -309,7 +309,7 @@ opt_cmod_propagation_local(const intel_device_info *devinfo, bblock_t *block)
             if (inst->conditional_mod == BRW_CONDITIONAL_NZ &&
                 scan_inst->opcode == BRW_OPCODE_CMP &&
                 brw_reg_type_is_integer(inst->dst.type)) {
-               inst->remove(block);
+               inst->remove(block, true);
                progress = true;
                break;
             }
@@ -403,17 +403,17 @@ opt_cmod_propagation_local(const intel_device_info *devinfo, bblock_t *block)
                        inst->src[0].type == BRW_REGISTER_TYPE_UD) ||
                       (inst->conditional_mod == BRW_CONDITIONAL_L &&
                        inst->src[0].type == BRW_REGISTER_TYPE_D)) {
-                     inst->remove(block);
+                     inst->remove(block, true);
                      progress = true;
                      break;
                   }
                } else if (scan_inst->conditional_mod == inst->conditional_mod) {
-                  inst->remove(block);
+                  inst->remove(block, true);
                   progress = true;
                   break;
                } else if (!read_flag) {
                   scan_inst->conditional_mod = inst->conditional_mod;
-                  inst->remove(block);
+                  inst->remove(block, true);
                   progress = true;
                   break;
                }
@@ -499,7 +499,7 @@ opt_cmod_propagation_local(const intel_device_info *devinfo, bblock_t *block)
                  scan_inst->conditional_mod == cond)) {
                scan_inst->conditional_mod = cond;
                scan_inst->flag_subreg = inst->flag_subreg;
-               inst->remove(block);
+               inst->remove(block, true);
                progress = true;
             }
             break;
@@ -513,6 +513,9 @@ opt_cmod_propagation_local(const intel_device_info *devinfo, bblock_t *block)
       }
    }
 
+   /* There is progress if and only if instructions were removed. */
+   assert(progress == (block->end_ip_delta != 0));
+
    return progress;
 }
 
@@ -525,8 +528,11 @@ fs_visitor::opt_cmod_propagation()
       progress = opt_cmod_propagation_local(devinfo, block) || progress;
    }
 
-   if (progress)
+   if (progress) {
+      cfg->adjust_block_ips();
+
       invalidate_analysis(DEPENDENCY_INSTRUCTIONS);
+   }
 
    return progress;
 }