Mesa (master): r300/compiler: Fix bug in rc_get_variables()

Tom Stellard tstellar at kemper.freedesktop.org
Wed May 18 02:17:53 UTC 2011


Module: Mesa
Branch: master
Commit: 217cd216eac65983004ca77a9e49dbfad1b720b6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=217cd216eac65983004ca77a9e49dbfad1b720b6

Author: Tom Stellard <tstellar at gmail.com>
Date:   Tue May 17 18:51:20 2011 -0700

r300/compiler: Fix bug in rc_get_variables()

Variables that write to the same source select need to pe paired
together otherwise the register allocator might fail.

https://bugs.freedesktop.org/show_bug.cgi?id=36753

---

 .../drivers/dri/r300/compiler/radeon_variable.c    |   58 +++++---------------
 1 files changed, 13 insertions(+), 45 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_variable.c b/src/mesa/drivers/dri/r300/compiler/radeon_variable.c
index 33181bd..938fb84 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_variable.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_variable.c
@@ -292,20 +292,20 @@ struct rc_variable * rc_variable(
 }
 
 static void get_variable_helper(
-	struct rc_list ** aborted_list,
 	struct rc_list ** variable_list,
-	unsigned int aborted,
 	struct rc_variable * variable)
 {
-	if (aborted) {
-		rc_list_add(aborted_list, rc_list(&variable->C->Pool, variable));
-	} else {
-		rc_list_add(variable_list, rc_list(&variable->C->Pool, variable));
+	struct rc_list * list_ptr;
+	for (list_ptr = *variable_list; list_ptr; list_ptr = list_ptr->Next) {
+		if (readers_intersect(variable, list_ptr->Item)) {
+			rc_variable_add_friend(list_ptr->Item, variable);
+			return;
+		}
 	}
+	rc_list_add(variable_list, rc_list(&variable->C->Pool, variable));
 }
 
 static void get_variable_pair_helper(
-	struct rc_list ** aborted_list,
 	struct rc_list ** variable_list,
 	struct radeon_compiler * c,
 	struct rc_instruction * inst,
@@ -338,8 +338,7 @@ static void get_variable_pair_helper(
 	}
 	new_var = rc_variable(c, file, sub_inst->DestIndex, writemask,
 								&reader_data);
-	get_variable_helper(aborted_list, variable_list, reader_data.Abort,
-								new_var);
+	get_variable_helper(variable_list, new_var);
 }
 
 /**
@@ -352,10 +351,7 @@ static void get_variable_pair_helper(
 struct rc_list * rc_get_variables(struct radeon_compiler * c)
 {
 	struct rc_instruction * inst;
-	struct rc_list * aborted_list = NULL;
 	struct rc_list * variable_list = NULL;
-	struct rc_list * var_ptr;
-	struct rc_list * search_ptr;
 
 	for (inst = c->Program.Instructions.Next;
 					inst != &c->Program.Instructions;
@@ -372,43 +368,15 @@ struct rc_list * rc_get_variables(struct radeon_compiler * c)
 			new_var = rc_variable(c, inst->U.I.DstReg.File,
 				inst->U.I.DstReg.Index,
 				inst->U.I.DstReg.WriteMask, &reader_data);
-			get_variable_helper(&aborted_list, &variable_list,
-						reader_data.Abort, new_var);
+			get_variable_helper(&variable_list, new_var);
 		} else {
-			get_variable_pair_helper(&aborted_list, &variable_list,
-					c, inst, &inst->U.P.RGB);
-			get_variable_pair_helper(&aborted_list, &variable_list,
-					c, inst, &inst->U.P.Alpha);
+			get_variable_pair_helper(&variable_list, c, inst,
+							&inst->U.P.RGB);
+			get_variable_pair_helper(&variable_list, c, inst,
+							&inst->U.P.Alpha);
 		}
 	}
 
-	/* The aborted_list contains a list of variables that might share a
-	 * reader with another variable.  We need to search through this list
-	 * and pair together variables that do share the same reader.
-	 */
-	while (aborted_list) {
-		struct rc_list * search_ptr_next;
-		struct rc_variable * var;
-		var_ptr = aborted_list;
-		for (var = var_ptr->Item; var; var = var->Friend) {
-
-			search_ptr = var_ptr->Next;
-			while(search_ptr) {
-				search_ptr_next = search_ptr->Next;
-				if (readers_intersect(var, search_ptr->Item)){
-					rc_list_remove(&aborted_list,
-							search_ptr);
-					rc_variable_add_friend(var,
-							search_ptr->Item);
-				}
-				search_ptr = search_ptr_next;
-			}
-		}
-		rc_list_remove(&aborted_list, var_ptr);
-		rc_list_add(&variable_list, rc_list(
-			&((struct rc_variable*)(var_ptr->Item))->C->Pool,
-			var_ptr->Item));
-	}
 	return variable_list;
 }
 




More information about the mesa-commit mailing list