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