nir/inline: Make the rewrite_param_derefs helper work on instructions
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 25 May 2016 17:36:23 +0000 (10:36 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 27 May 2016 17:28:27 +0000 (10:28 -0700)
Now that we have the better nir_foreach_block macro, there's no reason to
use the archaic block version for everything.

Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/compiler/nir/nir_inline_functions.c

index 5f9dae40994d29e00c3079e2015f7f419c56d641..a4365b5db231a179391df966ad1a70e3063567fe 100644 (file)
 
 static bool inline_function_impl(nir_function_impl *impl, struct set *inlined);
 
-static bool
-rewrite_param_derefs_block(nir_block *block, nir_call_instr *call)
+static void
+rewrite_param_derefs(nir_instr *instr, nir_call_instr *call)
 {
-   nir_foreach_instr(instr, block) {
-      if (instr->type != nir_instr_type_intrinsic)
-         continue;
-
-      nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
+   if (instr->type != nir_instr_type_intrinsic)
+      return;
 
-      for (unsigned i = 0;
-           i < nir_intrinsic_infos[intrin->intrinsic].num_variables; i++) {
-         if (intrin->variables[i]->var->data.mode != nir_var_param)
-            continue;
+   nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
 
-         int param_idx = intrin->variables[i]->var->data.location;
+   for (unsigned i = 0;
+        i < nir_intrinsic_infos[intrin->intrinsic].num_variables; i++) {
+      if (intrin->variables[i]->var->data.mode != nir_var_param)
+         continue;
 
-         nir_deref_var *call_deref;
-         if (param_idx >= 0) {
-            assert(param_idx < call->callee->num_params);
-            call_deref = call->params[param_idx];
-         } else {
-            call_deref = call->return_deref;
-         }
-         assert(call_deref);
+      int param_idx = intrin->variables[i]->var->data.location;
 
-         nir_deref_var *new_deref = nir_deref_as_var(nir_copy_deref(intrin, &call_deref->deref));
-         nir_deref *new_tail = nir_deref_tail(&new_deref->deref);
-         new_tail->child = intrin->variables[i]->deref.child;
-         ralloc_steal(new_tail, new_tail->child);
-         intrin->variables[i] = new_deref;
+      nir_deref_var *call_deref;
+      if (param_idx >= 0) {
+         assert(param_idx < call->callee->num_params);
+         call_deref = call->params[param_idx];
+      } else {
+         call_deref = call->return_deref;
       }
-   }
+      assert(call_deref);
 
-   return true;
+      nir_deref_var *new_deref = nir_deref_as_var(nir_copy_deref(intrin, &call_deref->deref));
+      nir_deref *new_tail = nir_deref_tail(&new_deref->deref);
+      new_tail->child = intrin->variables[i]->deref.child;
+      ralloc_steal(new_tail, new_tail->child);
+      intrin->variables[i] = new_deref;
+   }
 }
 
 static void
@@ -184,7 +180,8 @@ inline_functions_block(nir_block *block, nir_builder *b,
       }
 
       nir_foreach_block(block, callee_copy) {
-         rewrite_param_derefs_block(block, call);
+         nir_foreach_instr(instr, block)
+            rewrite_param_derefs(instr, call);
       }
 
       /* Pluck the body out of the function and place it here */