Currently, clang compiles explicit initializers for array elements into series of store instructions. For large arrays of built-in types this results in bloated output code and significant amount of time spent on the instruction selection phase. This patch fixes the issue by initializing such arrays with global constants that store the binary image of the initializer.
Details
Diff Detail
Event Timeline
lib/CodeGen/CGExprAgg.cpp | ||
---|---|---|
421 | Is there a good reason to use an element-count heuristic instead of a total-size heuristic here? Why only builtin types? That seems to pointlessly rule out nested arrays, complex types, vectors, C structs, and so on. I think the predicate you probably want here is isTriviallyCopyableType. |
lib/CodeGen/CGExprAgg.cpp | ||
---|---|---|
421 |
Yes, the code below generates per-element initialization only for explicitly specified initializers. The rest, if any, is initialized with a filler, so it doesn't affect the size of the resulting code much. |
lib/CodeGen/CGExprAgg.cpp | ||
---|---|---|
421 | That makes sense, but you could still base it on the total size being initialized with explicit initializers. Such initializers, even when constant, are likely to require code size basically proportionate to the number of bytes initialized — sizes of immediate operands and all that. |
Updated to consider the total size of the explicit initializers instead of their number. The threshold value is adjusted respectively.
Is there a good reason to use an element-count heuristic instead of a total-size heuristic here?
Why only builtin types? That seems to pointlessly rule out nested arrays, complex types, vectors, C structs, and so on. I think the predicate you probably want here is isTriviallyCopyableType.