Message352228
| Author | sir-sigurd |
|---|---|
| Recipients | sir-sigurd |
| Date | 2019-09-12.19:34:23 |
| SpamBayes Score | -1.0 |
| Marked as misclassified | Yes |
| Message-id | <1568316863.5.0.507617055887.issue38147@roundup.psfhosted.org> |
| In-reply-to |
| Content | |
|---|---|
GCC (along with Clang and ICC) has __builtin_unreachable() and MSVC has __assume() builtins, that can be used to optimize out unreachable conditions. So we could add macro like this: #ifdef Py_DEBUG # define Py_ASSUME(cond) (assert(cond)) #else # if defined(_MSC_VER) # define Py_ASSUME(cond) (__assume(cond)) # elif defined(__GNUC__) # define Py_ASSUME(cond) (cond? (void)0: __builtin_unreachable()) # else # define Py_ASSUME(cond) ((void)0); # endif #endif Here's a pair of really simple examples showing how it can optimize code: https://godbolt.org/z/g9LYXF. Real world example. _PyLong_Copy() [1] calls _PyLong_New() [2]. _PyLong_New() checks the size, so that overflow does not occur. This check is redundant when _PyLong_New() is called from _PyLong_Copy(). We could add a function that bypass that check, but in LTO build PyObject_MALLOC() is inlined into _PyLong_New() and it also checks the size. Adding Py_ASSUME((size_t)size <= MAX_LONG_DIGITS) allows to bypass both checks. [1] https://github.com/python/cpython/blob/3a4f66707e824ef3a8384827590ebaa6ca463dc0/Objects/longobject.c#L287-L309 [2] https://github.com/python/cpython/blob/3a4f66707e824ef3a8384827590ebaa6ca463dc0/Objects/longobject.c#L264-L283 |
|
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2019-09-12 19:34:23 | sir-sigurd | set | recipients: + sir-sigurd |
| 2019-09-12 19:34:23 | sir-sigurd | set | messageid: <1568316863.5.0.507617055887.issue38147@roundup.psfhosted.org> |
| 2019-09-12 19:34:23 | sir-sigurd | link | issue38147 messages |
| 2019-09-12 19:34:23 | sir-sigurd | create | |