r600g: compute support for evergreen
[mesa.git] / src / glsl / opt_if_simplification.cpp
index 021615ebd126f686dc111cfe293ad1d856bade81..7e88208f7c141b19dffbc0c23faa7fcecf335c88 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 /**
- * \file ir_if_simplification.cpp
+ * \file opt_if_simplification.cpp
  *
  * Moves constant branches of if statements out to the surrounding
  * instruction stream.
@@ -38,10 +38,21 @@ public:
    }
 
    ir_visitor_status visit_leave(ir_if *);
+   ir_visitor_status visit_enter(ir_assignment *);
 
    bool made_progress;
 };
 
+/* We only care about the top level "if" instructions, so don't
+ * descend into expressions.
+ */
+ir_visitor_status
+ir_if_simplification_visitor::visit_enter(ir_assignment *ir)
+{
+   (void) ir;
+   return visit_continue_with_parent;
+}
+
 bool
 do_if_simplification(exec_list *instructions)
 {
@@ -55,6 +66,14 @@ do_if_simplification(exec_list *instructions)
 ir_visitor_status
 ir_if_simplification_visitor::visit_leave(ir_if *ir)
 {
+   /* If the if statement has nothing on either side, remove it. */
+   if (ir->then_instructions.is_empty() &&
+       ir->else_instructions.is_empty()) {
+      ir->remove();
+      this->made_progress = true;
+      return visit_continue;
+   }
+
    /* FINISHME: Ideally there would be a way to note that the condition results
     * FINISHME: in a constant before processing both of the other subtrees.
     * FINISHME: This can probably be done with some flags, but it would take