1. Assembler / Говнокод #20423

    +388

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    return instruction emitted twice with branch target inbetween
    
    function
    
    unsigned int fact( unsigned int n) { return n < 1 ? 1 : n*fact(n-1); }
    
    produces
    
    fact:
    .LFB0:
            .cfi_startproc
            testl   %edi, %edi
            movl    $1, %eax
            je      .L4
            .p2align 4,,10
            .p2align 3
    .L3:
            imull   %edi, %eax
            subl    $1, %edi
            jne     .L3
            rep ret # <-- this instruction can be removed
    .L4:
            rep ret
            .cfi_endproc
    .LFE0:
            .size   fact, .-fact
            .section        .text.unlikely

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71923 даже факториал не могут скомпилировать нормально

    j123123, 25 Июля 2016

    Комментарии (52)