nir: Relax opt_if logic to prevent re-merging 64bit phis for loop headers
[mesa.git] / src / compiler / nir / nir_opt_access.c
index 766f056568ab83b7ea9df0e870ab7ea2b52e6f36..d428e29f6ea24fa22940f9f83f3a89b6148ce4d9 100644 (file)
@@ -120,6 +120,7 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
 
       _mesa_set_add(state->vars_written, var);
       state->buffers_written = true;
+      break;
 
    case nir_intrinsic_memory_barrier:
       state->buffer_barriers = true;
@@ -134,11 +135,12 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
       state->image_barriers = true;
       break;
 
-   case nir_intrinsic_scoped_memory_barrier:
+   case nir_intrinsic_scoped_barrier:
       /* TODO: Could be more granular if we had nir_var_mem_image. */
       if (nir_intrinsic_memory_modes(instr) & (nir_var_mem_ubo |
                                                nir_var_mem_ssbo |
-                                               nir_var_uniform)) {
+                                               nir_var_uniform |
+                                               nir_var_mem_global)) {
          state->buffer_barriers = true;
          state->image_barriers = true;
       }
@@ -158,12 +160,12 @@ process_variable(struct access_state *state, nir_variable *var)
       return false;
 
    /* Ignore variables we've already marked */
-   if (var->data.image.access & ACCESS_CAN_REORDER)
+   if (var->data.access & ACCESS_CAN_REORDER)
       return false;
 
-   if (!(var->data.image.access & ACCESS_NON_WRITEABLE) &&
+   if (!(var->data.access & ACCESS_NON_WRITEABLE) &&
        !_mesa_set_search(state->vars_written, var)) {
-      var->data.image.access |= ACCESS_NON_WRITEABLE;
+      var->data.access |= ACCESS_NON_WRITEABLE;
       return true;
    }
 
@@ -246,7 +248,7 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
 
       /* Check if we were able to mark the whole variable non-writeable */
       if (!(nir_intrinsic_access(instr) & ACCESS_NON_WRITEABLE) &&
-          var->data.image.access & ACCESS_NON_WRITEABLE) {
+          var->data.access & ACCESS_NON_WRITEABLE) {
          progress = true;
          nir_intrinsic_set_access(instr,
                                   nir_intrinsic_access(instr) |
@@ -320,7 +322,9 @@ nir_opt_access(nir_shader *shader)
       }
    }
 
-   nir_foreach_variable(var, &shader->uniforms)
+   nir_foreach_variable_with_modes(var, shader, nir_var_uniform |
+                                                nir_var_mem_ubo |
+                                                nir_var_mem_ssbo)
       var_progress |= process_variable(&state, var);
 
    nir_foreach_function(func, shader) {