STINNER Victor <vstin...@redhat.com> added the comment:
I tested PR 10079 using gdb on Fedora 28 with GCC 8.1.1 to check if Py_INCREF/Py_DECREF functions are inlined. I understand that "static inline void Py_INCREF()" is *not* inline by gcc -O0, but it *is* inlined using gcc -Og which is the *default* optimization level of ./configure --with-debug. To develop on Python, I force -O0, because the compilation time matters more than runtime performance for me :-) Compilation on my laptop using MAKEFLAGS=-j9: * -O0: 21s * -0g: 36s (1.7x slower) ... But Py_INCREF/DECREF are always inlined, even with -O0, when using __attribute__((always_inline))! I will work on a change to use that. == gcc -O0 == (gdb) disassemble Py_IncRef Dump of assembler code for function Py_IncRef: ... 0x000000000047276a <+20>: cmpq $0x0,-0x8(%rbp) 0x000000000047276f <+25>: je 0x47277d <Py_IncRef+39> 0x0000000000472771 <+27>: mov -0x8(%rbp),%rax 0x0000000000472775 <+31>: mov %rax,%rdi 0x0000000000472778 <+34>: callq 0x472523 <_Py_INCREF> 0x000000000047277d <+39>: nop 0x000000000047277e <+40>: leaveq 0x000000000047277f <+41>: retq (gdb) disassemble Py_DecRef Dump of assembler code for function Py_DecRef: ... 0x0000000000472794 <+20>: cmpq $0x0,-0x8(%rbp) 0x0000000000472799 <+25>: je 0x4727b1 <Py_DecRef+49> 0x000000000047279b <+27>: mov -0x8(%rbp),%rax 0x000000000047279f <+31>: mov %rax,%rdx 0x00000000004727a2 <+34>: mov $0xe1,%esi 0x00000000004727a7 <+39>: mov $0x65c550,%edi 0x00000000004727ac <+44>: callq 0x472554 <_Py_DECREF> 0x00000000004727b1 <+49>: nop 0x00000000004727b2 <+50>: leaveq 0x00000000004727b3 <+51>: retq == gcc -Og == (gdb) disassemble Py_IncRef Dump of assembler code for function Py_IncRef: 0x0000000000462de2 <+0>: test %rdi,%rdi 0x0000000000462de5 <+3>: je 0x462dfb <Py_IncRef+25> 0x0000000000462de7 <+5>: addq $0x1,0x4bfc09(%rip) # 0x9229f8 <_Py_RefTotal> 0x0000000000462def <+13>: mov 0x10(%rdi),%rax 0x0000000000462df3 <+17>: add $0x1,%rax 0x0000000000462df7 <+21>: mov %rax,0x10(%rdi) 0x0000000000462dfb <+25>: retq (gdb) disassemble Py_DecRef Dump of assembler code for function Py_DecRef: 0x0000000000463b2e <+0>: test %rdi,%rdi 0x0000000000463b31 <+3>: je 0x463b6f <Py_DecRef+65> 0x0000000000463b33 <+5>: sub $0x8,%rsp 0x0000000000463b37 <+9>: subq $0x1,0x4beeb9(%rip) # 0x9229f8 <_Py_RefTotal> 0x0000000000463b3f <+17>: mov 0x10(%rdi),%rax 0x0000000000463b43 <+21>: sub $0x1,%rax 0x0000000000463b47 <+25>: mov %rax,0x10(%rdi) 0x0000000000463b4b <+29>: je 0x463b68 <Py_DecRef+58> 0x0000000000463b4d <+31>: js 0x463b54 <Py_DecRef+38> 0x0000000000463b4f <+33>: add $0x8,%rsp 0x0000000000463b53 <+37>: retq 0x0000000000463b54 <+38>: mov %rdi,%rdx 0x0000000000463b57 <+41>: mov $0xe1,%esi 0x0000000000463b5c <+46>: mov $0x5e1120,%edi 0x0000000000463b61 <+51>: callq 0x462da4 <_Py_NegativeRefcount> 0x0000000000463b66 <+56>: jmp 0x463b4f <Py_DecRef+33> 0x0000000000463b68 <+58>: callq 0x463b0c <_Py_Dealloc> 0x0000000000463b6d <+63>: jmp 0x463b4f <Py_DecRef+33> 0x0000000000463b6f <+65>: retq ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue35059> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com