]> granicus.if.org Git - python/commitdiff
Disable _PyStack_AsTuple() inlining
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 11 Jan 2017 00:07:03 +0000 (01:07 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 11 Jan 2017 00:07:03 +0000 (01:07 +0100)
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
Objects/abstract.c

index def2975d4717b6440de31ed0a85a4d25102f3a52..03c664f397777d0e3f3327d28256f4fce59be82c 100644 (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.)
index 93bf87fa88d3a130c5b2222296e2993b08083217..5726160c08b4eeca9dfcb68141408343a107a1c4 100644 (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;