rcorcs added a comment.
LLVM already has the class PassBuilder::OptimizationLevel that encapsulates the
logic of both speed and size optimization levels. This class already checks
which values for SpeedLevel and SizeLevel are valid.
However, other parts of the code define two separate variables to describe
speed and size optimization levels with their semantic specified either in
comments or code. Note that when SizeLevel!=0, OptLevel (or SpeedLevel) is
usually expected to be 2, that is, their values are interdependent.
From my understanding, ideally, LLVM would use the same OptimizationLevel
encapsulation everywhere. If the same encapsulation is used everywhere we can
avoid conversions and guarantee
that they always have the same semantics.
For example, the class PassManagerBuilder defines these two separate variables
with their semantics in comments:
/// The Optimization Level - Specify the basic optimization level.
/// 0 = -O0, 1 = -O1, 2 = -O2, 3 = -O3
unsigned OptLevel;
/// SizeLevel - How much we're optimizing for size.
/// 0 = none, 1 = -Os, 2 = -Oz
unsigned SizeLevel;
On the other hand, the class ThinLTOCodeGenerator defines the semantics of
OptLevel in code:
/// IR optimization level: from 0 to 3.
void setOptLevel(unsigned NewOptLevel) {
OptLevel = (NewOptLevel > 3) ? 3 : NewOptLevel;
}
This patch standardizes the use of OptimizationLevel across PassBuilder,
PassManagerBuilder, LTO configuration, and LTO code generators. Even with this
patch, further work is still needed to standardize the use of OptimizationLevel
across LLVM.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D81223/new/
https://reviews.llvm.org/D81223
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits