In LLVM_ENABLE_STATS=0 builds, llvm::Statistic maps to llvm::NoopStatistic but has 3 mostly unused
pointers. GlobalOpt considers that the pointers can potentially retain allocated
objects, so GlobalOpt cannot optimize out the NoopStatistic variables (see
D69428 for more context), wasting 23KiB for stage 2 clang.
This patch makes NoopStatistic empty and thus reclaims the wasted space. The
clang size is even smaller than applying D69428 (slightly smaller in both .bss and
.text).
# this means the D69428 optimization on clang is mostly nullified by this patch. There may be cases GlobalOpt doesn't do a good job optimizing out the old NoopStatistic and we probably need to investigate HEAD+D69428: size(.bss) = 0x0725a8 HEAD+D101211: size(.bss) = 0x072238 # bloaty - HEAD+D69428 vs HEAD+D101211 # With D101211, we also save a lot of string table space (.rodata). FILE SIZE VM SIZE -------------- -------------- -0.0% -32 -0.0% -24 .eh_frame -0.0% -336 [ = ] 0 .symtab -0.0% -360 [ = ] 0 .strtab [ = ] 0 -0.2% -880 .bss -0.0% -2.11Ki -0.0% -2.11Ki .rodata -0.0% -2.89Ki -0.0% -2.89Ki .text -0.0% -5.71Ki -0.0% -5.88Ki TOTAL
Note: LoopFuse is a disabled pass. For now this patch adds #if LLVM_ENABLE_STATS so OptimizationRemarkMissed is skipped in LLVM_ENABLE_STATS==0 builds.
If these OptimizationRemarkMissed are useful and not noisy, we can replace llvm::Statistic with llvm::TrackingStatistic, or use a different abstraction to keep track of the strings.
Losing this remark seems unfortunate - looks like this contradicts the statement in the patch description that these pointers are unused? Mostly unused, but not entirely.
Perhaps this use could be migrated to something else? Or perhaps the Statistic classes could store the strings as char[] members (using some SFINAE/factory template to get the right sizes) so they aren't pointers - if that would address the issue?