mesa: set up gl_vert_result and gl_frag_attrib values for gl_ClipDistance.
[mesa.git] / src / glsl / opt_copy_propagation_elements.cpp
index 238a1a75eeae226e277565b301d492b98c50020e..a91e624cb720ae793a09ff2c0c185ab1f7a4ccc0 100644 (file)
@@ -161,9 +161,16 @@ ir_visitor_status
 ir_copy_propagation_elements_visitor::visit_leave(ir_assignment *ir)
 {
    ir_dereference_variable *lhs = ir->lhs->as_dereference_variable();
+   ir_variable *var = ir->lhs->variable_referenced();
+
+   if (var->type->is_scalar() || var->type->is_vector()) {
+      kill_entry *k;
+
+      if (lhs)
+        k = new(mem_ctx) kill_entry(var, ir->write_mask);
+      else
+        k = new(mem_ctx) kill_entry(var, ~0);
 
-   if (lhs && (lhs->type->is_scalar() || lhs->type->is_vector())) {
-      kill_entry *k = new(mem_ctx) kill_entry(lhs->var, ir->write_mask);
       kill(k);
    }
 
@@ -383,8 +390,10 @@ ir_copy_propagation_elements_visitor::kill(kill_entry *k)
 
       if (entry->lhs == k->var) {
         entry->write_mask = entry->write_mask & ~k->write_mask;
-        if (entry->write_mask == 0)
+        if (entry->write_mask == 0) {
            entry->remove();
+           continue;
+        }
       }
       if (entry->rhs == k->var) {
         entry->remove();
@@ -409,11 +418,8 @@ ir_copy_propagation_elements_visitor::add_copy(ir_assignment *ir)
    int orig_swizzle[4] = {0, 1, 2, 3};
    int swizzle[4];
 
-   if (ir->condition) {
-      ir_constant *condition = ir->condition->as_constant();
-      if (!condition || !condition->value.b[0])
-        return;
-   }
+   if (ir->condition)
+      return;
 
    ir_dereference_variable *lhs = ir->lhs->as_dereference_variable();
    if (!lhs || !(lhs->type->is_scalar() || lhs->type->is_vector()))