Refactor ir_dereference support for ir_hierarchical_visitor

Move the accept method for hierarchical visitors from ir_dereference
to the derived classes.  This was mostly straight-forward, but I
suspect that ir_dead_code_local may be broken now.
diff --git a/ir_dead_code.cpp b/ir_dead_code.cpp
index aa8ebf8..2ede7ff 100644
--- a/ir_dead_code.cpp
+++ b/ir_dead_code.cpp
@@ -60,14 +60,11 @@
 class ir_dead_code_visitor : public ir_hierarchical_visitor {
 public:
    virtual ir_visitor_status visit(ir_variable *);
+   virtual ir_visitor_status visit(ir_dereference_variable *);
 
    virtual ir_visitor_status visit_enter(ir_function *);
-   virtual ir_visitor_status visit_enter(ir_dereference *);
-   virtual ir_visitor_status visit_leave(ir_dereference *);
    virtual ir_visitor_status visit_leave(ir_assignment *);
 
-   ir_dead_code_visitor(void);
-
    variable_entry *get_variable_entry(ir_variable *var);
 
    bool (*predicate)(ir_instruction *ir);
@@ -75,16 +72,8 @@
 
    /* List of variable_entry */
    exec_list variable_list;
-
-   /* Depth of derefernce stack. */
-   int in_dereference;
 };
 
-ir_dead_code_visitor::ir_dead_code_visitor(void)
-{
-   this->in_dereference = 0;
-}
-
 
 variable_entry *
 ir_dead_code_visitor::get_variable_entry(ir_variable *var)
@@ -106,12 +95,21 @@
 ir_dead_code_visitor::visit(ir_variable *ir)
 {
    variable_entry *entry = this->get_variable_entry(ir);
-   if (entry) {
-      if (this->in_dereference)
-	 entry->referenced_count++;
-      else
-	 entry->declaration = true;
-   }
+   if (entry)
+      entry->declaration = true;
+
+   return visit_continue;
+}
+
+
+ir_visitor_status
+ir_dead_code_visitor::visit(ir_dereference_variable *ir)
+{
+   ir_variable *const var = ir->variable_referenced();
+   variable_entry *entry = this->get_variable_entry(var);
+
+   if (entry)
+      entry->referenced_count++;
 
    return visit_continue;
 }
@@ -126,24 +124,6 @@
 
 
 ir_visitor_status
-ir_dead_code_visitor::visit_enter(ir_dereference *ir)
-{
-   (void) ir;
-   this->in_dereference++;
-   return visit_continue;
-}
-
-
-ir_visitor_status
-ir_dead_code_visitor::visit_leave(ir_dereference *ir)
-{
-   (void) ir;
-   this->in_dereference--;
-   return visit_continue;
-}
-
-
-ir_visitor_status
 ir_dead_code_visitor::visit_leave(ir_assignment *ir)
 {
    variable_entry *entry;