Hi,

Segher Boessenkool <seg...@kernel.crashing.org> writes:

> Hi Jiufu,
>
> On Thu, Jul 09, 2020 at 04:01:38PM +0800, Jiufu Guo wrote:
>> Segher Boessenkool <seg...@kernel.crashing.org> writes:
>> >> But for each single condition, loop unrolling may still be helpful.
>> >> While, if these conditions are all occur in a loop, it would be more
>> >> possible to get negative impacts after unrolled.
>> >
>> > Yes, but how many loops have *all* these conditions?  That is my problem
>> > with it: it is only tested with one specific loop, and only benefits
>> > that loop.
>> 
>> I also encounter a few of this kind of loops, some in hot path of leela
>> and perlbench, and had negative impact leelar_r (~2%), perlbench(>0.5%),
>> and also gcc_r.  I had a quick count, there are ~500 this kind of loops
>> occur in specint build.
>
> If the generic code decides to unroll big loops with calls *and* jumps,
> there is a big problem there?
>
> On most targets, it should not unroll loops with calls *at all*, for
> example.
>
>> >> While, actually, here we would need condition to define *complex* loop,
>> >> where contains call exist (may just 1), branch exist(may 2) and early
>> >> exit(may 1) at the same time, but each number is not large.
>> >> Any sugguestions? Thanks.
>> >
>> > How many loops have you seen where all those conditions are true, but
>> > the generic code still decides to unroll things?
>> Some occur as above said.  I use -fopt-info to compare the changed
>> unroll_adjust_hook to check loops of this kind.
>
> But there are a few cases where we *do* want to unroll, you say?  What
> is special about those cases, what do they do differently?
During tests, if avoid unroll loops if there is call (or early exit).
As I remember there are performance downgrade on 1 or 2 benchmarks, but
I forget which ones. I check and confirm.

BR.
Jiufu,

>
>
> Segher

Reply via email to