PR rtl-optimization/64081: Enable RTL loop unrolling for duplicated exit blocks and back edges (with AIX fixes)
Aldy Hernandez
aldyh@redhat.com
Wed Feb 15 11:01:00 GMT 2017
On 02/13/2017 07:15 PM, Jeff Law wrote:
> So it seems in your updated patch there is only one call where we ask
> for LOOP_EXIT_COMPLEX, specifically the call from get_loop_location.
>
> But I don't see how asking for LOOP_EXIT_COMPLEX from that location
> would change whether or not we unroll any given loop (which is the core
> of bz64081).
>
> Am I missing something?
Ughh, only the spaghetti that is this code? ;-).
get_loop_location is only called once in the compiler, in
decide_unrolling(). This call to get_loop_location() will set the loop
description, particularly desc->simple_p where you point out.
Later on down in decide_unrolling(), we decide the number of iterations,
and use desc->simple_p to ignore the loop if it is not simple.
decide_unroll_constant_iterations (loop, flags);
if (loop->lpt_decision.decision == LPT_NONE)
decide_unroll_runtime_iterations (loop, flags);
if (loop->lpt_decision.decision == LPT_NONE)
decide_unroll_stupid (loop, flags);
Any one of these functions will bail if the loop description was not
simple_p:
/* Check for simple loops. */
desc = get_simple_loop_desc (loop);
/* Check simpleness. */
if (!desc->simple_p || desc->assumptions)
{
if (dump_file)
fprintf (dump_file,
";; Unable to prove that the number of iterations "
"can be counted in runtime\n");
return;
}
(Yes, there's a lot of duplicated code in decide_unroll_*_iterations.)
Now a problem I see here is that decide_unroll_*_iterations all call
get_simple_loop_desc() which is basically LOOP_EXIT_SIMPLE, but since
the value is already cached we return the previous call that was
LOOP_EXIT_COMPLEX. So the code works because we will already have a
cached value.
I think to make it clearer we could:
1. Add an assert in get_loop_desc to make sure that if we're returning a
cached loop description, that the LOOP_EXIT_TYPEs match. Just in case...
2. Change all the decide_unroll_*_iterations variants to specifically
ask for a LOOP_EXIT_TYPE, not just the simple variant. And have this
set to LOOP_EXIT_COMPLEX from decide_unrolling. Right now, this is all
working because we have only one call to get_loop_location, but I assume
that could change.
3. And finally, what the heck is get_loop_location doing in cfgloop,
when it's only used once within loop-unroll.c? I say we move it to
loop-unroll.c and mark it static.
Does this help?
Aldy
More information about the Gcc-patches
mailing list