Reimplement has_call_callback using ir_hierarchical_vistor
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 14 May 2010 21:11:06 +0000 (14:11 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 17 May 2010 19:03:13 +0000 (12:03 -0700)
This has the added advantage that it will stop traversing the tree as
soon as the first call is found.

The output of all test cases was verified to be the same using diff.

ir_basic_block.cpp

index 455398e499c39a8c4ec95f15a84a8d06d14f7d6e..2cf37046059da0b2b892917aea2bb55c1209ee00 100644 (file)
 #include <stdio.h>
 #include "ir.h"
 #include "ir_visitor.h"
-#include "ir_visit_tree.h"
 #include "ir_basic_block.h"
 #include "glsl_types.h"
 
-static void
-has_call_callback(ir_instruction *ir, void *data)
-{
-   bool *has_call = (bool *)data;
+class ir_has_call_visitor : public ir_hierarchical_visitor {
+public:
+   ir_has_call_visitor()
+   {
+      has_call = false;
+   }
 
-   *has_call = *has_call || ir->as_call();
-}
+   virtual ir_visitor_status visit_enter(ir_call *ir)
+   {
+      (void) ir;
+      has_call = true;
+      return visit_stop;
+   }
+
+   bool has_call;
+};
 
 /**
  * Calls a user function for every basic block in the instruction stream.
@@ -108,7 +116,7 @@ void call_for_basic_blocks(exec_list *instructions,
            call_for_basic_blocks(&ir_sig->body, callback, data);
         }
       } else if (ir->as_assignment()) {
-        bool has_call = false;
+        ir_has_call_visitor v;
 
         /* If there's a call in the expression tree being assigned,
          * then that ends the BB too.
@@ -123,9 +131,8 @@ void call_for_basic_blocks(exec_list *instructions,
          * expression flattener may be useful before using the basic
          * block finder to get more maximal basic blocks out.
          */
-        ir_visit_tree(ir, has_call_callback, &has_call);
-
-        if (has_call) {
+        ir->accept(&v);
+        if (v.has_call) {
            callback(leader, ir, data);
            leader = NULL;
         }