Disable _PyStack_AsTuple() inlining

Issue #29234: Inlining _PyStack_AsTuple() into callers increases their stack
consumption, Disable inlining to optimize the stack consumption.

Add _Py_NO_INLINE: use __attribute__((noinline)) of GCC and Clang.

It reduces the stack consumption, bytes per call, before => after:

test_python_call: 1040 => 976 (-64 B)
test_python_getitem: 976 => 912 (-64 B)
test_python_iterator: 1120 => 1056 (-64 B)

=> total: 3136 => 2944 (- 192 B)
This commit is contained in:
Victor Stinner 2017-01-11 01:07:03 +01:00
parent 415c5107be
commit b915bc354e
2 changed files with 17 additions and 2 deletions

View File

@ -507,7 +507,7 @@ extern "C" {
* locality.
*
* Usage:
* int _Py_HOT_FUNCTION x() { return 3; }
* int _Py_HOT_FUNCTION x(void) { return 3; }
*
* Issue #28618: This attribute must not be abused, otherwise it can have a
* negative effect on performance. Only the functions were Python spend most of
@ -521,6 +521,19 @@ extern "C" {
#define _Py_HOT_FUNCTION
#endif
/* _Py_NO_INLINE
* Disable inlining on a function. For example, it helps to reduce the C stack
* consumption.
*
* Usage:
* int _Py_NO_INLINE x(void) { return 3; }
*/
#if defined(__GNUC__) || defined(__clang__)
# define _Py_NO_INLINE __attribute__((noinline))
#else
# define _Py_NO_INLINE
#endif
/**************************************************************************
Prototypes that are missing from the standard include files on some systems
(and possibly only some versions of such systems.)

View File

@ -2256,7 +2256,9 @@ PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
return _Py_CheckFunctionResult(callable, result, NULL);
}
PyObject*
/* Issue #29234: Inlining _PyStack_AsTuple() into callers increases their
stack consumption, Disable inlining to optimize the stack consumption. */
PyObject* _Py_NO_INLINE
_PyStack_AsTuple(PyObject **stack, Py_ssize_t nargs)
{
PyObject *args;