glsl: use ir_rvalue_visitor for function inlining
authorTimothy Arceri <tarceri@itsqueeze.com>
Mon, 7 Nov 2022 01:00:02 +0000 (12:00 +1100)
committerMarge Bot <emma+marge@anholt.net>
Thu, 8 Dec 2022 05:22:27 +0000 (05:22 +0000)
This allows us to drop some duplicate code that is already in the
ir_rvalue_visitor. It also allows us to better replace rvalues
and handle swizzle in the following patch without having to add
even more duplicate code.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19890>

src/compiler/glsl/opt_function_inlining.cpp

index 590bd70..d27944d 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "ir.h"
 #include "ir_visitor.h"
+#include "ir_rvalue_visitor.h"
 #include "ir_function_inlining.h"
 #include "ir_expression_flattening.h"
 #include "compiler/glsl_types.h"
@@ -37,7 +38,7 @@
 static void
 do_variable_replacement(exec_list *instructions,
                         ir_variable *orig,
-                        ir_dereference *repl);
+                        ir_rvalue *repl);
 
 namespace {
 
@@ -251,9 +252,7 @@ ir_call::generate_inline(ir_instruction *next_ir)
       ir_variable *sig_param = (ir_variable *) formal_node;
 
       if (should_replace_variable(sig_param, param)) {
-        ir_dereference *deref = param->as_dereference();
-
-        do_variable_replacement(&new_instructions, sig_param, deref);
+         do_variable_replacement(&new_instructions, sig_param, param);
       }
    }
 
@@ -342,9 +341,9 @@ ir_function_inlining_visitor::visit_enter(ir_call *ir)
  * also appear in the sampler field of an ir_tex instruction.
  */
 
-class ir_variable_replacement_visitor : public ir_hierarchical_visitor {
+class ir_variable_replacement_visitor : public ir_rvalue_visitor {
 public:
-   ir_variable_replacement_visitor(ir_variable *orig, ir_dereference *repl)
+   ir_variable_replacement_visitor(ir_variable *orig, ir_rvalue *repl)
    {
       this->orig = orig;
       this->repl = repl;
@@ -355,27 +354,29 @@ public:
    }
 
    virtual ir_visitor_status visit_leave(ir_call *);
-   virtual ir_visitor_status visit_leave(ir_dereference_array *);
-   virtual ir_visitor_status visit_leave(ir_dereference_record *);
    virtual ir_visitor_status visit_leave(ir_texture *);
    virtual ir_visitor_status visit_leave(ir_assignment *);
-   virtual ir_visitor_status visit_leave(ir_expression *);
-   virtual ir_visitor_status visit_leave(ir_return *);
 
+   void handle_rvalue(ir_rvalue **rvalue);
    void replace_deref(ir_dereference **deref);
    void replace_rvalue(ir_rvalue **rvalue);
 
    ir_variable *orig;
-   ir_dereference *repl;
+   ir_rvalue *repl;
 };
 
 void
 ir_variable_replacement_visitor::replace_deref(ir_dereference **deref)
 {
    ir_dereference_variable *deref_var = (*deref)->as_dereference_variable();
-   if (deref_var && deref_var->var == this->orig) {
-      *deref = this->repl->clone(ralloc_parent(*deref), NULL);
-   }
+   if (deref_var && deref_var->var == this->orig)
+      *deref = this->repl->as_dereference()->clone(ralloc_parent(*deref), NULL);
+}
+
+void
+ir_variable_replacement_visitor::handle_rvalue(ir_rvalue **rvalue)
+{
+   replace_rvalue(rvalue);
 }
 
 void
@@ -389,8 +390,9 @@ ir_variable_replacement_visitor::replace_rvalue(ir_rvalue **rvalue)
    if (!deref)
       return;
 
-   replace_deref(&deref);
-   *rvalue = deref;
+   ir_dereference_variable *deref_var = (deref)->as_dereference_variable();
+   if (deref_var && deref_var->var == this->orig)
+      *rvalue = this->repl->clone(ralloc_parent(deref), NULL);
 }
 
 ir_visitor_status
@@ -398,7 +400,7 @@ ir_variable_replacement_visitor::visit_leave(ir_texture *ir)
 {
    replace_deref(&ir->sampler);
 
-   return visit_continue;
+   return rvalue_visit(ir);
 }
 
 ir_visitor_status
@@ -411,37 +413,6 @@ ir_variable_replacement_visitor::visit_leave(ir_assignment *ir)
 }
 
 ir_visitor_status
-ir_variable_replacement_visitor::visit_leave(ir_expression *ir)
-{
-   for (uint8_t i = 0; i < ir->num_operands; i++)
-      replace_rvalue(&ir->operands[i]);
-
-   return visit_continue;
-}
-
-ir_visitor_status
-ir_variable_replacement_visitor::visit_leave(ir_return *ir)
-{
-   replace_rvalue(&ir->value);
-
-   return visit_continue;
-}
-
-ir_visitor_status
-ir_variable_replacement_visitor::visit_leave(ir_dereference_array *ir)
-{
-   replace_rvalue(&ir->array);
-   return visit_continue;
-}
-
-ir_visitor_status
-ir_variable_replacement_visitor::visit_leave(ir_dereference_record *ir)
-{
-   replace_rvalue(&ir->record);
-   return visit_continue;
-}
-
-ir_visitor_status
 ir_variable_replacement_visitor::visit_leave(ir_call *ir)
 {
    foreach_in_list_safe(ir_rvalue, param, &ir->actual_parameters) {
@@ -449,7 +420,7 @@ ir_variable_replacement_visitor::visit_leave(ir_call *ir)
       replace_rvalue(&new_param);
 
       if (new_param != param) {
-        param->replace_with(new_param);
+         param->replace_with(new_param);
       }
    }
    return visit_continue;
@@ -458,7 +429,7 @@ ir_variable_replacement_visitor::visit_leave(ir_call *ir)
 static void
 do_variable_replacement(exec_list *instructions,
                         ir_variable *orig,
-                        ir_dereference *repl)
+                        ir_rvalue *repl)
 {
    ir_variable_replacement_visitor v(orig, repl);