Why ret disappear with optimization?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | int suma(int* array, int len) { asm(" xor %eax, %eax # resultado = 0 " " xor %edx, %edx # i = 0 " "1: add (%rdi,%rdx,4), %eax # res += array[i] " " inc %edx # ++i " " cmp %edx,%esi # i < len? " " jne 1b # repetir " // " ret " ); } int main() { int v[100]; return suma(v, 100); } |
为什么GCC在
来自
1 | gcc version 8.2.1 20181011 (Red Hat 8.2.1-4) (GCC) |
I assume 64bit..., array in rdi, len in esi.
您使用的是内联asm,而不是
为了回答这个主要问题,编译器简单地将
但是执行是从一个非空函数(
如果在EDOCX1 OR 1的结尾添加EDCOX1×6,那么EDCOX1×2将以EDCOX1×5指令结束。
令人惊讶的是,gcc在godbolt编译器资源管理器上只给出了一个带有-o3-墙的警告:
1 2 3 4 | <source>: In function 'int suma(int*, int)': <source>:13:1: warning: no return statement in function returning non-void [-Wreturn-type] } ^ |
由此产生的
1 2 3 4 5 6 7 | main: xor %eax, %eax # resultado = 0 xor %edx, %edx # i = 0 1: add (%rdi,%rdx,4), %eax # res += array[i] inc %edx # ++i cmp %edx,%esi # i < len? jne 1b # repetir |
在