Bug 39710 - emits gravely misaligned loops
Summary: emits gravely misaligned loops
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: gcc10 (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Gleb F-Malinovskiy
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-02-21 14:42 MSK by alexey.tourbin
Modified: 2021-02-21 14:42 MSK (History)
2 users (show)

See Also:


Attachments
to reproduce misaligned loop (4.69 KB, text/x-csrc)
2021-02-21 14:42 MSK, alexey.tourbin
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description alexey.tourbin 2021-02-21 14:42:47 MSK
Created attachment 9208 [details]
to reproduce misaligned loop

Мужчины, надеюсь что импортонезависимость вашего дистрибутива день ото дня крепчает.

Я написал тугой цикл, который должен выполняться со скоростью 2.5 цикла на итерацию, а он выполняется со скоростью 3.5 цикла на итерацию.  Я некоторое время чесал репу, пока не заметил, что компилятор выравнивает этот цикл на 12 mod 16, и даже более того 28 mod 32, и даже более того 60 mod 64!

Приложил файл bench-patch.c (из своего репозитория pfor16.git), на котором можно воспроизвести невыровненный цикл.

    while (e1--) {
        unsigned w = Bload16le(src);
        unsigned i = w & Mask(7);
        unsigned x = w >> 7;
        src += 2;
        v[i] += x << m;
    }

$ gcc -DPatch=patch128 -DM=2 -g -O2 -Wall bench-patch.c &&
objdump -S ./a.out | sed -n '/while (e1--)/,/AGGR/p'
    while (e1--) {
    12b1:       4c 89 c2                mov    %r8,%rdx
    12b4:       85 c9                   test   %ecx,%ecx
    12b6:       0f 84 84 00 00 00       je     1340 <bench+0x1e0>
    12bc:       0f b7 02                movzwl (%rdx),%eax
    12bf:       48 83 c2 02             add    $0x2,%rdx
    12c3:       49 89 c6                mov    %rax,%r14
    12c6:       c1 e8 05                shr    $0x5,%eax
    12c9:       41 83 e6 7f             and    $0x7f,%r14d
    12cd:       25 fc 07 00 00          and    $0x7fc,%eax
    12d2:       66 42 01 04 76          add    %ax,(%rsi,%r14,2)
    12d7:       4c 39 fa                cmp    %r15,%rdx
    12da:       75 e0                   jne    12bc <bench+0x15c>

Мужчины, "jne 12bc" - это как такое выравнивание называется?  Это выравнивание называется последние четыре байта кеш-линии.  Что-то не так у вас в консерватории.

$ gcc --version
x86_64-alt-linux-gcc (GCC) 10.2.1 20201125 (ALT Sisyphus 10.2.1-alt2)