Bug 38274 - gcc emits big chunks of junk instructions
Summary: gcc emits big chunks of junk instructions
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: gcc9 (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: 2020-03-24 23:58 MSK by alexey.tourbin
Modified: 2020-03-25 18:27 MSK (History)
4 users (show)

See Also:


Attachments
delta16dec_tail (359 bytes, text/x-csrc)
2020-03-24 23:58 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 2020-03-24 23:58:47 MSK
Created attachment 8679 [details]
delta16dec_tail

Мужчины, это смех и горе, я пытаюсь скомпилировать вот такой код:

void delta16dec_tail(uint16_t *v, size_t n, unsigned v1)
{
    if (n == 1)
        goto last;
    unsigned v0;
    uint16_t *last = v + n - 1;
    do {
        v0 = v[0], v0 += v1, v[0] = v0;
        v1 = v[1], v1 += v0, v[1] = v1;
        v += 2;
    } while (v < last);
    if (v == last) {
last:   *v += v1;
    }
}

И то что показывает ваш компилятор, это так сказать defies imagination.  Многое компилятору можно простить, но здесь это просто что-то возмутительное!

    if (n == 1)
   0:	89 d1                	mov    %edx,%ecx
   2:	48 83 fe 01          	cmp    $0x1,%rsi
   6:	74 58                	je     60 <delta16dec_tail+0x60>
        goto last;
    uint16_t *last = v + n - 1;
   8:	48 8d 74 77 fe       	lea    -0x2(%rdi,%rsi,2),%rsi
   d:	48 89 f8             	mov    %rdi,%rax
    do {
  10:	0f b7 08             	movzwl (%rax),%ecx
  13:	48 83 c0 04          	add    $0x4,%rax
  17:	01 ca                	add    %ecx,%edx
  19:	0f b7 48 fe          	movzwl -0x2(%rax),%ecx
  1d:	66 89 50 fc          	mov    %dx,-0x4(%rax)
  21:	01 ca                	add    %ecx,%edx
  23:	66 89 50 fe          	mov    %dx,-0x2(%rax)
  27:	89 d1                	mov    %edx,%ecx
    } while (v < last);
  29:	48 39 c6             	cmp    %rax,%rsi
  2c:	77 e2                	ja     10 <delta16dec_tail+0x10>
  2e:	48 89 f8             	mov    %rdi,%rax
  31:	48 8d 57 01          	lea    0x1(%rdi),%rdx
  35:	48 f7 d0             	not    %rax
  38:	48 01 f0             	add    %rsi,%rax
  3b:	48 c1 e8 02          	shr    $0x2,%rax
  3f:	48 39 d6             	cmp    %rdx,%rsi
  42:	ba 04 00 00 00       	mov    $0x4,%edx
  47:	48 8d 04 85 04 00 00 	lea    0x4(,%rax,4),%rax
  4e:	00 
  4f:	48 0f 42 c2          	cmovb  %rdx,%rax
  53:	48 01 c7             	add    %rax,%rdi
    if (v == last) {
  56:	48 39 fe             	cmp    %rdi,%rsi
  59:	74 05                	je     60 <delta16dec_tail+0x60>
  5b:	c3                   	retq   
  5c:	0f 1f 40 00          	nopl   0x0(%rax)
last:   *v += v1;
  60:	66 01 0f             	add    %cx,(%rdi)
  63:	c3                   	retq   

Что это за длинная последовательность инструкций между "while (v < last)" и "if (v == last)" (2e-53)?

Я помню в детстве, когда только научился читать, в книжном магазине иногда продавались хорошие книжки, но купить их можно было только с "нагрузкой".  В нагрузку тебе еще продавали полкило всякой галиматьи, решения такого-то съезда в жизнь, девятнадцатая партконференция КПСС и т.п.  С тех пор ничего не изменилось.  Если хочешь подраскрутить цикл, чтобы он побыстрее работал, то gcc тебе в нагрузку отвесит с десяток ненужных инструкций.
Comment 1 Michael Shigorin 2020-03-25 15:09:17 MSK
(ни на что не намекаю)
Comment 2 Dmitry V. Levin 2020-03-25 18:27:36 MSK
Предлагаю репортить баги про gcc в https://gcc.gnu.org/bugs/#report