Compiler optimization causing program to run slower

后端 未结 3 1567
孤街浪徒
孤街浪徒 2020-12-11 04:00

I have the following piece of code that I wrote in C. Its fairly simple as it just right bit-shifts x for every loop of for.

int main() {
   int         


        
相关标签:
3条回答
  • 2020-12-11 04:11

    The optimized loop is producing an infinite loop which is a result of you depending on signed integer overflow. Signed integer overflow is undefined behavior in C and should not be depended on. Not only can it confuse developers it may also be optimized out by the compiler.

    Assembly (no optimizations): gcc -std=c99 -S -O0 main.c

    _main:
    LFB2:
        pushq   %rbp
    LCFI0:
        movq    %rsp, %rbp
    LCFI1:
        movl    $1, -4(%rbp)
        movl    $0, -8(%rbp)
        jmp L2
    L3:
        incl    -8(%rbp)
    L2:
        cmpl    $-2, -8(%rbp)
        jg  L3
        movl    $0, %eax
        leave
        ret
    


    Assembly (optimized level 3): gcc -std=c99 -S -O3 main.c

    _main:
    LFB2:
        pushq   %rbp
    LCFI0:
        movq    %rsp, %rbp
    LCFI1:
    L2:
        jmp L2  #<- infinite loop
    
    0 讨论(0)
  • 2020-12-11 04:12

    You will get the definitive answer by looking at the binary that's produced (using objdump or something).

    But as others have noted, this is probably because you're relying on undefined behaviour. One possible explanation is that the compiler is free to assume that i will never be less than -2, and so will eliminate the conditional entirely, and convert this into an infinite loop.

    Also, your code has no observable side effects, so the compiler is also free to optimise the entire program away to nothing, if it likes.

    0 讨论(0)
  • 2020-12-11 04:15

    Additional information about why integer overflows are undefined can be found here:

    http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html

    Search for the paragraph "Signed integer overflow".

    0 讨论(0)
提交回复
热议问题