https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65741
Bug ID: 65741 Summary: Missed loop optimization with asm Product: gcc Version: 5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: inline-asm Assignee: unassigned at gcc dot gnu.org Reporter: gccbugzilla at limegreensocks dot com Trimming the code down to minimal: int main() { int lo; for(int x=0; x < 10; x++) { asm ( "# asm here" : "=r" (lo)); } return lo; } Compile with: c++.exe -O2 -m64 -S loop.cpp x86_64-w64-mingw32 5.0.0 The -O2 optimization correctly detects that the asm statement can be moved outside the loop (and moves it). However, it then leaves an empty loop: movl $10, %edx /APP # 7 "loop.cpp" 1 # # 0 "" 2 .p2align 4,,10 /NO_APP .L2: subl $1, %edx jne .L2 With the asm moved, the .L2 loop serves no purpose. I expected it to get optimized out. Even more perplexing is that if the asm has 2 outputs, it *doesn't* get moved outside the loop: int main() { int hi, lo; for(int x=0; x < 10; x++) { asm ( "# asm here" : "=r" (lo), "=r" (hi)); } return hi * lo; } movl $10, %edx .p2align 4,,10 .L2: /APP # 7 "loop.cpp" 1 # asm here # 0 "" 2 /NO_APP subl $1, %edx jne .L2 I expected this asm to get moved just like the other one did.