aboutsummaryrefslogtreecommitdiffstats
path: root/XCompile.txt
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2023-09-16 06:19:02 -0700
committerChris Robinson <[email protected]>2023-09-16 06:19:02 -0700
commit2e293ee7cbc6f0dbd069ba7c678d20c1af16872f (patch)
tree56558220d4ffab395eef821d7aef12b4cd8c5cae /XCompile.txt
parent10f2acdabb307df25c11b8ee11f770e4e62bb5fd (diff)
Don't inline some big functions
This is very dumb. Template functions are implicitly marked inline according to C++, and contrary to popular belief, "inline" *does* influence the compiler's decision to inline a function. A function the compiler may not have decided to inline normally may be inlined anyway, or issue a warning if it still decides not to inline, if explicitly or implicitly marked as such (or does inline it as requested, but then decides to not inline different functions it normally would because of a cumulative code size increase or something). Furthermore, once a function becomes inline due to being a template function, there's no way to undo it. Marking an inline function "noinline" pushes the problem the other way, causing the compiler to not inline a function it may have decided was beneficial to inline. There's no way to declare a template function to be inlined based solely on compiler heuristics, it will always be influenced by the implicit "inline" or explicit "noinline". That's what's happening here. A number of functions had been combined into a smaller number of large-ish template functions to reduce code duplication and ease maintanence, causing them to be implicitly inline as a side-effect. GCC then manages to inline these larger functions as implicitly requested, but in doing so prevents other smaller functions (which are explicitly marked inline) from being inlined due to excessive code increase and issue a warning. The "noinline" is a heavy-handed method of un-pessimizing the optimization pass, on the assumption the compiler apparently doesn't actually want to inline the template functions, but does so because they're technically marked inline. There's no good option here until it gets acknowledged that inline does mean something beyond allowing multiple definitions, and that template (and other types of) function definitions sometimes (if not most often) want to allow multiple definitions but don't want an artificial/detrimental boost in inline prioritization. /rant
Diffstat (limited to 'XCompile.txt')
0 files changed, 0 insertions, 0 deletions