[ADT] Remove StatisticBase and make NoopStatistic empty

Authored by MaskRay on Apr 26 2021, 1:39 PM.


[ADT] Remove StatisticBase and make NoopStatistic empty

In LLVM_ENABLE_STATS=0 builds, llvm::Statistic maps to llvm::NoopStatistic
but has 3 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

# This means the D69428 optimization on clang is mostly nullified by this patch.
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. 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 in the future.

Reviewed By: lattner

Differential Revision: https://reviews.llvm.org/D101211