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 тебе в нагрузку отвесит с десяток ненужных инструкций.
(ни на что не намекаю)
Предлагаю репортить баги про gcc в https://gcc.gnu.org/bugs/#report