forked from OSchip/llvm-project
[flang][driver] Fix opt-level option parsing
This update makes sure that `flang-new -O2 -O0` will run at `-O0` rather than `-O2`. This bug was identified and originally fixed by Vyacheslav Zakharin in https://reviews.llvm.org/D130035. I've extracted the fix into a separate patch. co-authored by: Vyacheslav Zakharin <vyacheslav.p.zakharin@intel.com> Differential Revision: https://reviews.llvm.org/D130104
This commit is contained in:
parent
b1847ff068
commit
bbdf5c37e3
|
@ -90,6 +90,25 @@ static bool parseShowColorsArgs(const llvm::opt::ArgList &args,
|
|||
llvm::sys::Process::StandardErrHasColors());
|
||||
}
|
||||
|
||||
/// Extracts the optimisation level from \a args.
|
||||
static unsigned getOptimizationLevel(llvm::opt::ArgList &args,
|
||||
clang::DiagnosticsEngine &diags) {
|
||||
unsigned defaultOpt = llvm::CodeGenOpt::None;
|
||||
|
||||
if (llvm::opt::Arg *a =
|
||||
args.getLastArg(clang::driver::options::OPT_O_Group)) {
|
||||
if (a->getOption().matches(clang::driver::options::OPT_O0))
|
||||
return llvm::CodeGenOpt::None;
|
||||
|
||||
assert(a->getOption().matches(clang::driver::options::OPT_O));
|
||||
|
||||
return getLastArgIntValue(args, clang::driver::options::OPT_O, defaultOpt,
|
||||
diags);
|
||||
}
|
||||
|
||||
return defaultOpt;
|
||||
}
|
||||
|
||||
bool Fortran::frontend::parseDiagnosticArgs(clang::DiagnosticOptions &opts,
|
||||
llvm::opt::ArgList &args) {
|
||||
opts.ShowColors = parseShowColorsArgs(args);
|
||||
|
@ -100,9 +119,7 @@ bool Fortran::frontend::parseDiagnosticArgs(clang::DiagnosticOptions &opts,
|
|||
static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
|
||||
llvm::opt::ArgList &args,
|
||||
clang::DiagnosticsEngine &diags) {
|
||||
unsigned defaultOpt = llvm::CodeGenOpt::None;
|
||||
opts.OptimizationLevel = clang::getLastArgIntValue(
|
||||
args, clang::driver::options::OPT_O, defaultOpt, diags);
|
||||
opts.OptimizationLevel = getOptimizationLevel(args, diags);
|
||||
|
||||
if (args.hasFlag(clang::driver::options::OPT_fdebug_pass_manager,
|
||||
clang::driver::options::OPT_fno_debug_pass_manager, false))
|
||||
|
|
|
@ -6,6 +6,10 @@
|
|||
! RUN: %flang -S -O2 %s -Xflang -fdebug-pass-manager -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK-O2
|
||||
! RUN: %flang_fc1 -S -O2 %s -fdebug-pass-manager -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK-O2
|
||||
|
||||
! Verify that only the left-most `-O{n}` is used
|
||||
! RUN: %flang -S -O2 -O0 %s -Xflang -fdebug-pass-manager -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK-O0
|
||||
! RUN: %flang_fc1 -S -O2 -O0 %s -fdebug-pass-manager -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK-O0
|
||||
|
||||
! CHECK-O0-NOT: Running pass: SimplifyCFGPass on simple_loop_
|
||||
! CHECK-O0: Running analysis: TargetLibraryAnalysis on simple_loop_
|
||||
|
||||
|
|
Loading…
Reference in New Issue