[LLVMdev] Separating loop nests based on profile information?
Krzysztof Parzyszek
kparzysz at codeaurora.org
Mon Jan 12 11:40:49 PST 2015
Upon closer inspection, the loop will not become irreducible. However,
the result will be equivalent to reloading the hoisted values after
calling "helper". In fact, that's what may happen if some CFG
optimization cleans this up.
-Krzysztof
On 1/12/2015 1:00 PM, Krzysztof Parzyszek wrote:
> On 1/7/2015 7:19 PM, Philip Reames wrote:
>>
>> The approach I've been playing with would create this loop structure:
>> goto inner
>> while (true) {
>> outer:
>> helper();
>> inner:
>> while( some_condition )
>> //do lots of work here
>> if (!some_rare_condition) { <-- This is loop variant
>> goto outer;
>> }
>> }
>> }
>>
>
> Anything that changes loop structure into something like this, is a
> fundamentally bad idea. This would make the outer loop irreducible,
> which should be avoided.
>
> A lot better approach would be to privatize the invariant objects, and
> write them back to memory before/after the "helper" is invoked:
>
> T1 = p->x;
> T2 = P->y;
> while( some_condition )
> //do lots of work here, use T1 and T2
> if (some_rare_condition) { <-- This is loop variant
> p->x = T1;
> p->y = T2;
> helper();
> T1 = p->x;
> T2 = p->y;
> }
> }
> p->x = T1;
> p->y = T2;
>
>
> -Krzysztof
>
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
More information about the llvm-dev
mailing list