diff options
author | Andreas Klebinger <klebinger.andreas@gmx.at> | 2020-11-17 19:01:08 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-11-26 16:00:32 -0500 |
commit | a84e53f978341135355c5c82cd7af2ae2efa5e72 (patch) | |
tree | 931c79cf29f6ce8fbb38b19a5c1250a0855d5ca5 /includes | |
parent | be5d74caab64abf9d986fc7290f62731db7e73e7 (diff) | |
download | haskell-a84e53f978341135355c5c82cd7af2ae2efa5e72.tar.gz |
RTS: Fix failed inlining of copy_tag.
On windows using gcc-10 gcc failed to inline copy_tag into evacuate.
To fix this we now set the always_inline attribute for the various
copy* functions in Evac.c. The main motivation here is not the
overhead of the function call, but rather that this allows the code
to "specialize" for the size of the closure we copy which is often
known at compile time.
An earlier commit also tried to avoid evacuate_large inlining. But
didn't quite succeed. So I also marked evacuate_large as noinline.
Fixes #12416
Diffstat (limited to 'includes')
-rw-r--r-- | includes/Rts.h | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/includes/Rts.h b/includes/Rts.h index 1e5a60262b..027d5173a1 100644 --- a/includes/Rts.h +++ b/includes/Rts.h @@ -37,12 +37,17 @@ extern "C" { #include "HsFFI.h" #include "RtsAPI.h" -// Turn off inlining when debugging - it obfuscates things +// Disencourage gcc from inlining when debugging - it obfuscates things #if defined(DEBUG) # undef STATIC_INLINE # define STATIC_INLINE static #endif +// Fine grained inlining control helpers. +#define ATTR_ALWAYS_INLINE __attribute__((always_inline)) +#define ATTR_NOINLINE __attribute__((noinline)) + + #include "rts/Types.h" #include "rts/Time.h" |