From b915bc354e57889a93943159a6a238e0c9c20daa Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 11 Jan 2017 01:07:03 +0100 Subject: 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) --- Include/pyport.h | 15 ++++++++++++++- Objects/abstract.c | 4 +++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Include/pyport.h b/Include/pyport.h index def2975..03c664f 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -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.) diff --git a/Objects/abstract.c b/Objects/abstract.c index 93bf87f..5726160 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -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; -- cgit v0.12