Turning off unrolling to certain loops

Zdenek Dvorak rakdver@kam.mff.cuni.cz
Thu Oct 15 14:41:00 GMT 2009


Hi,

> I faced a similar issue a while ago. I filed a bug report 
> (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36712) In the end, 
> I implemented a simple tree-level unrolling pass in our port
> which uses all the existing infrastructure. It works quite well for 
> our purpose, but I hesitated to submit the patch because it contains
> our not-very-elegannt #prgama unroll implementation. 

could you please do so anyway?  Even if there are some issues with the
#prgama unroll implementation, it could serve as a basis of a usable
patch.

> /* Perfect unrolling of a loop */
> static void tree_unroll_perfect_loop (struct loop *loop, unsigned factor,
> 		  edge exit)
> {
> ...
> }
> 
> 
>                   
> /* Go through all the loops: 
>      1. Determine unrolling factor
>      2. Unroll loops in different conditions
>         -- perfect loop: no extra copy of original loop
>         -- other loops: the original version of loops to execute the remaining iterations
> */        
> static unsigned int rest_of_tree_unroll (void)
> {
...
>        tree niters = number_of_exit_cond_executions(loop);
>        
>        bool perfect_unrolling = false;
>        if(niters != NULL_TREE && niters!= chrec_dont_know && TREE_CODE(niters) == INTEGER_CST){
>          int num_iters = tree_low_cst(niters, 1);
>          if((num_iters % unroll_factor) == 0)
>            perfect_unrolling = true;
>        }
>        
>        /* If no. of iterations can be divided by unrolling factor, we have perfect unrolling */
>        if(perfect_unrolling){
>          tree_unroll_perfect_loop(loop, unroll_factor, single_dom_exit(loop));
>        }
>        else{
>          tree_unroll_loop (loop, unroll_factor, single_dom_exit (loop), &desc);
>        }

It would be better to move this test to tree_unroll_loop, and not
duplicate its code in tree_unroll_perfect_loop.

Zdenek



More information about the Gcc mailing list