diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_pair_regalloc.c b/src/mesa/drivers/dri/r300/compiler/radeon_pair_regalloc.c index 49983d6..98c7780 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_pair_regalloc.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_pair_regalloc.c @@ -515,6 +515,7 @@ static void do_advanced_regalloc(struct regalloc_state * s) unsigned int class_index; /* Compute the live intervals */ rc_variable_compute_live_intervals(var_ptr->Item); + rc_variable_print(var_ptr->Item); class_index = variable_get_class(var_ptr->Item, rc_class_list); diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_variable.c b/src/mesa/drivers/dri/r300/compiler/radeon_variable.c index 16fa5d2..2954f02 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_variable.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_variable.c @@ -264,6 +264,10 @@ void rc_variable_add_friend( { assert(var->Dst.Index == friend->Dst.Index); while(var->Friend) { + /* Make sure not to add the same variable twice. */ + if (var->Friend == friend) { + return; + } var = var->Friend; } var->Friend = friend; @@ -387,18 +391,15 @@ struct rc_list * rc_get_variables(struct radeon_compiler * c) * and pair together variables that do share the same reader. */ while (aborted_list) { - struct rc_list * search_ptr_next; var_ptr = aborted_list; search_ptr = var_ptr->Next; while(search_ptr) { - search_ptr_next = search_ptr->Next; if (readers_intersect(var_ptr->Item, search_ptr->Item)){ - rc_list_remove(&aborted_list, search_ptr); rc_variable_add_friend(var_ptr->Item, search_ptr->Item); } - search_ptr = search_ptr_next; + search_ptr = search_ptr->Next; } rc_list_remove(&aborted_list, var_ptr); rc_list_add(&variable_list, rc_list(