https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118222
Bug ID: 118222 Summary: When adding fno-inline, the register does not follow abi Product: gcc Version: 11.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: ipa Assignee: unassigned at gcc dot gnu.org Reporter: zou116 at purdue dot edu Target Milestone: --- We noticed that GCC made a mistake about register allocation when compiling with "O2 -fno-inline". Specifically, by disassembling the binary compiled by GCC, we have: 0x00000000000009d7 <+39>: mov %edx,%edi 0x00000000000009d9 <+41>: call 0x30 <is_ENOTSUP> 0x00000000000009de <+46>: cmp $0x26,%edx Where is_ENOTSUP is an easy function: (gdb) disassemble is_ENOTSUP Dump of assembler code for function is_ENOTSUP: 0x0000000000000030 <+0>: cmp $0x5f,%edi 0x0000000000000033 <+3>: sete %al 0x0000000000000036 <+6>: ret End of assembler dump. Note that according to the abi rule of x86_AMD, edx should not be used, since the rdx is not preserved across function calls. I also use clang with the same optimization flag, and I have: 0x0000000000004dee <+30>: mov (%rax),%ebx 0x0000000000004df0 <+32>: mov %ebx,%edi 0x0000000000004df2 <+34>: call 0x4c70 <is_ENOTSUP> 0x0000000000004df7 <+39>: xor %edx,%edx To reproduce this bug, 1. Download the coreutils (with commit id e71b24cedc2ff640f94911298e53b24506f13062), and use the default "CC=gcc ./configure" to compile the Makefile. 2. Change "CFLAGS = -O2 -funit-at-a-time" to "CFLAGS = -O2 -funit-at-a-time -fno-inline". 3. Disassemble "./src/copy.o" and the assembler code can be found in the function "punch_hole". The environment: 1.gcc --version: gcc (Ubuntu 11.4.0-2ubuntu1~20.04) 11.4.0 2.lsb_release -a: LSB Version: core-11.1.0ubuntu2-noarch:printing-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal 3. clang --version: Ubuntu clang version 20.0.0 (++20241201083415+9becc4a3c966-1~exp1~20241201203535.1233) Target: x86_64-pc-linux-gnu The register usage for the preserved function call can be found in the 21 page of https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf