diff --git a/ir_basic_block.cpp b/ir_basic_block.cpp index 455398e499c..2cf37046059 100644 --- a/ir_basic_block.cpp +++ b/ir_basic_block.cpp @@ -30,17 +30,25 @@ #include #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; }