95 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "mcg.h"
 | |
| 
 | |
| static ARRAYOF(struct ir) allirs;
 | |
| static ARRAYOF(struct ir) rootirs;
 | |
| 
 | |
| static void addall(struct ir* ir)
 | |
| {
 | |
|     if (array_appendu(&allirs, ir))
 | |
|         return;
 | |
| 
 | |
|     if (ir->left)
 | |
|         addall(ir->left);
 | |
|     if (ir->right)
 | |
|         addall(ir->right);
 | |
| }
 | |
| 
 | |
| static void collect_irs(void)
 | |
| {
 | |
|     int i;
 | |
|     
 | |
|     allirs.count = rootirs.count = 0;
 | |
| 	for (i=0; i<current_proc->blocks.count; i++)
 | |
|     {
 | |
|         struct basicblock* bb = current_proc->blocks.item[i];
 | |
|         int j;
 | |
| 
 | |
|         for (j=0; j<bb->irs.count; j++)
 | |
| 		{
 | |
| 			struct ir* ir = bb->irs.item[j];
 | |
|             addall(ir);
 | |
| 			array_append(&rootirs, ir);
 | |
| 		}
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void clear_roots(void)
 | |
| {
 | |
| 	int i;
 | |
| 
 | |
| 	for (i=0; i<allirs.count; i++)
 | |
| 	{
 | |
| 		struct ir* ir = allirs.item[i];
 | |
| 		ir->root = NULL;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static void find_roots(void)
 | |
| {
 | |
| 	int i;
 | |
| 
 | |
| 	for (i=0; i<rootirs.count; i++)
 | |
| 	{
 | |
| 		struct ir* ir = rootirs.item[i];
 | |
| 		assert(!ir->root);
 | |
| 		ir->root = ir;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static void recursively_mark_root(struct ir* node, struct ir* root)
 | |
| {
 | |
| 	if (node != root)
 | |
| 	{
 | |
| 		if (node->root)
 | |
| 			return;
 | |
| 		node->root = root;
 | |
| 	}
 | |
| 
 | |
| 	if (node->left)
 | |
| 		recursively_mark_root(node->left, root);
 | |
| 	if (node->right)
 | |
| 		recursively_mark_root(node->right, root);
 | |
| }
 | |
| 
 | |
| static void find_non_roots(void)
 | |
| {
 | |
| 	int i;
 | |
| 
 | |
| 	for (i=0; i<rootirs.count; i++)
 | |
| 	{
 | |
| 		struct ir* ir = rootirs.item[i];
 | |
| 		recursively_mark_root(ir, ir);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void pass_group_irs(void)
 | |
| {
 | |
| 	collect_irs();
 | |
| 	clear_roots();
 | |
| 	find_roots();
 | |
| 	find_non_roots();
 | |
| }
 | |
| 
 | |
| /* vim: set sw=4 ts=4 expandtab : */
 | |
| 
 | |
| 
 |