Skip to content

Commit f9c0d1b

Browse files
committed
[Driver] Add -f[no-]legacy-pass-manager to supersede -f[no-]experimental-new-pass-manager
The new PM is considered stable and many downstream groups have adopted it (some have adopted it for more than two years). Add -f[no-]legacy-pass-manager to reflect the fact that it is no longer experimental and the legacy pass manager is something we strive to retire. In the future, when the legacy PM eventually goes away, -fno-experimental-new-pass-manager and -flegacy-pass-manager will be removed. This patch also changes -f[no-]legacy-pass-manager to pass `-plugin-opt={new,legacy}-pass-manager` to the linker (supported by both ld.lld and LLVMgold.so) when -flto/-flto=thin is specified Reviewed By: aeubanks, rsmith Differential Revision: https://reviews.llvm.org/D92915
1 parent 7adcacd commit f9c0d1b

File tree

9 files changed

+54
-34
lines changed

9 files changed

+54
-34
lines changed

clang/include/clang/Basic/CodeGenOptions.def

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,7 @@ CODEGENOPT(DisableLifetimeMarkers, 1, 0) ///< Don't emit any lifetime markers
6161
CODEGENOPT(DisableO0ImplyOptNone , 1, 0) ///< Don't annonate function with optnone at O0
6262
CODEGENOPT(ExperimentalStrictFloatingPoint, 1, 0) ///< Enables the new, experimental
6363
///< strict floating point.
64-
CODEGENOPT(ExperimentalNewPassManager, 1, 0) ///< Enables the new, experimental
65-
///< pass manager.
64+
CODEGENOPT(LegacyPassManager, 1, 0) ///< Use the legacy pass manager.
6665
CODEGENOPT(DebugPassManager, 1, 0) ///< Prints debug information for the new
6766
///< pass manager.
6867
CODEGENOPT(DisableRedZone , 1, 0) ///< Set when -mno-red-zone is enabled.

clang/include/clang/Driver/Options.td

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,9 +1351,13 @@ def fglobal_isel : Flag<["-"], "fglobal-isel">, Group<f_clang_Group>,
13511351
HelpText<"Enables the global instruction selector">;
13521352
def fexperimental_isel : Flag<["-"], "fexperimental-isel">, Group<f_clang_Group>,
13531353
Alias<fglobal_isel>;
1354-
defm experimental_new_pass_manager : BooleanMarshalledFFlag<"experimental-new-pass-manager", "CodeGenOpts.ExperimentalNewPassManager",
1355-
"static_cast<unsigned>(LLVM_ENABLE_NEW_PASS_MANAGER)", "Enables an experimental new pass manager in LLVM.",
1356-
"Disables an experimental new pass manager in LLVM.">, Group<f_clang_Group>, Flags<[CC1Option]>;
1354+
defm legacy_pass_manager : BooleanMarshalledFFlag<"legacy-pass-manager", "CodeGenOpts.LegacyPassManager",
1355+
"static_cast<unsigned>(LLVM_ENABLE_NEW_PASS_MANAGER)", "Use the legacy pass manager in LLVM",
1356+
"Use the new pass manager in LLVM">, Group<f_clang_Group>, Flags<[CC1Option]>;
1357+
def fexperimental_new_pass_manager : Flag<["-"], "fexperimental-new-pass-manager">,
1358+
Group<f_clang_Group>, Flags<[CC1Option]>, Alias<fno_legacy_pass_manager>;
1359+
def fno_experimental_new_pass_manager : Flag<["-"], "fno-experimental-new-pass-manager">,
1360+
Group<f_clang_Group>, Flags<[CC1Option]>, Alias<flegacy_pass_manager>;
13571361
def fexperimental_strict_floating_point : Flag<["-"], "fexperimental-strict-floating-point">,
13581362
Group<f_clang_Group>, Flags<[CC1Option]>,
13591363
HelpText<"Enables experimental strict floating point in LLVM.">,

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,7 +1482,7 @@ static void runThinLTOBackend(
14821482
}
14831483

14841484
Conf.ProfileRemapping = std::move(ProfileRemapping);
1485-
Conf.UseNewPM = CGOpts.ExperimentalNewPassManager;
1485+
Conf.UseNewPM = !CGOpts.LegacyPassManager;
14861486
Conf.DebugPassManager = CGOpts.DebugPassManager;
14871487
Conf.RemarksWithHotness = CGOpts.DiagnosticsWithHotness;
14881488
Conf.RemarksFilename = CGOpts.OptRecordFile;
@@ -1572,7 +1572,7 @@ void clang::EmitBackendOutput(DiagnosticsEngine &Diags,
15721572

15731573
EmitAssemblyHelper AsmHelper(Diags, HeaderOpts, CGOpts, TOpts, LOpts, M);
15741574

1575-
if (CGOpts.ExperimentalNewPassManager)
1575+
if (!CGOpts.LegacyPassManager)
15761576
AsmHelper.EmitAssemblyWithNewPassManager(Action, std::move(OS));
15771577
else
15781578
AsmHelper.EmitAssembly(Action, std::move(OS));

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5848,8 +5848,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
58485848
false))
58495849
CmdArgs.push_back("-fmodules-debuginfo");
58505850

5851-
Args.AddLastArg(CmdArgs, options::OPT_fexperimental_new_pass_manager,
5852-
options::OPT_fno_experimental_new_pass_manager);
5851+
Args.AddLastArg(CmdArgs, options::OPT_flegacy_pass_manager,
5852+
options::OPT_fno_legacy_pass_manager);
58535853

58545854
ObjCRuntime Runtime = AddObjCRuntimeArgs(Args, Inputs, CmdArgs, rewriteKind);
58555855
RenderObjCOptions(TC, D, RawTriple, Args, Runtime, rewriteKind != RK_None,

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -595,11 +595,13 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
595595
Path));
596596
}
597597

598-
// Need this flag to turn on new pass manager via Gold plugin.
599-
if (Args.hasFlag(options::OPT_fexperimental_new_pass_manager,
600-
options::OPT_fno_experimental_new_pass_manager,
601-
/* Default */ LLVM_ENABLE_NEW_PASS_MANAGER)) {
602-
CmdArgs.push_back("-plugin-opt=new-pass-manager");
598+
// Pass an option to enable/disable the new pass manager.
599+
if (auto *A = Args.getLastArg(options::OPT_flegacy_pass_manager,
600+
options::OPT_fno_legacy_pass_manager)) {
601+
if (A->getOption().matches(options::OPT_flegacy_pass_manager))
602+
CmdArgs.push_back("-plugin-opt=legacy-pass-manager");
603+
else
604+
CmdArgs.push_back("-plugin-opt=new-pass-manager");
603605
}
604606

605607
// Setup statistics file output.

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,10 +1006,10 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
10061006
setPGOUseInstrumentor(Opts, Opts.ProfileInstrumentUsePath);
10071007
Opts.ProfileRemappingFile =
10081008
std::string(Args.getLastArgValue(OPT_fprofile_remapping_file_EQ));
1009-
if (!Opts.ProfileRemappingFile.empty() && !Opts.ExperimentalNewPassManager) {
1009+
if (!Opts.ProfileRemappingFile.empty() && Opts.LegacyPassManager) {
10101010
Diags.Report(diag::err_drv_argument_only_allowed_with)
1011-
<< Args.getLastArg(OPT_fprofile_remapping_file_EQ)->getAsString(Args)
1012-
<< "-fexperimental-new-pass-manager";
1011+
<< Args.getLastArg(OPT_fprofile_remapping_file_EQ)->getAsString(Args)
1012+
<< "-fno-legacy-pass-manager";
10131013
}
10141014

10151015
Opts.CoverageMapping =
@@ -1051,9 +1051,9 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
10511051

10521052
// -ftime-report= is only for new pass manager.
10531053
if (A->getOption().getID() == OPT_ftime_report_EQ) {
1054-
if (!Opts.ExperimentalNewPassManager)
1054+
if (Opts.LegacyPassManager)
10551055
Diags.Report(diag::err_drv_argument_only_allowed_with)
1056-
<< A->getAsString(Args) << "-fexperimental-new-pass-manager";
1056+
<< A->getAsString(Args) << "-fno-legacy-pass-manager";
10571057

10581058
StringRef Val = A->getValue();
10591059
if (Val == "per-pass")

clang/test/Driver/clang_f_opts.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -466,14 +466,6 @@
466466
// CHECK-WCHAR2-NOT: -fwchar-type=int
467467
// DELIMITERS: {{^ *"}}
468468

469-
// RUN: %clang -### -fno-experimental-new-pass-manager -fexperimental-new-pass-manager %s 2>&1 | FileCheck --check-prefix=CHECK-PM --check-prefix=CHECK-NEW-PM %s
470-
// RUN: %clang -### -fexperimental-new-pass-manager -fno-experimental-new-pass-manager %s 2>&1 | FileCheck --check-prefix=CHECK-PM --check-prefix=CHECK-NO-NEW-PM %s
471-
// CHECK-PM-NOT: argument unused
472-
// CHECK-NEW-PM: -fexperimental-new-pass-manager
473-
// CHECK-NEW-PM-NOT: -fno-experimental-new-pass-manager
474-
// CHECK-NO-NEW-PM: -fno-experimental-new-pass-manager
475-
// CHECK-NO-NEW-PM-NOT: -fexperimental-new-pass-manager
476-
477469
// RUN: %clang -### -S -fstrict-return %s 2>&1 | FileCheck -check-prefix=CHECK-STRICT-RETURN %s
478470
// RUN: %clang -### -S -fno-strict-return %s 2>&1 | FileCheck -check-prefix=CHECK-NO-STRICT-RETURN %s
479471
// CHECK-STRICT-RETURN-NOT: "-fno-strict-return"
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// RUN: %clang -### -c -flegacy-pass-manager -fno-legacy-pass-manager %s 2>&1 | FileCheck --check-prefixes=NOWARN,NEW %s
2+
// RUN: %clang -### -c -fno-legacy-pass-manager -flegacy-pass-manager %s 2>&1 | FileCheck --check-prefixes=NOWARN,LEGACY %s
3+
4+
/// -f[no-]experimental-new-pass-manager are legacy aliases when the new PM was still experimental.
5+
// RUN: %clang -### -c -fno-experimental-new-pass-manager -fexperimental-new-pass-manager %s 2>&1 | FileCheck --check-prefixes=NOWARN,NEW %s
6+
// RUN: %clang -### -c -fexperimental-new-pass-manager -fno-experimental-new-pass-manager %s 2>&1 | FileCheck --check-prefixes=NOWARN,LEGACY %s
7+
8+
// NOWARN-NOT: warning: argument unused
9+
10+
// NEW: -fno-legacy-pass-manager
11+
// NEW-NOT: -flegacy-pass-manager
12+
13+
// LEGACY: -flegacy-pass-manager
14+
// LEGACY-NOT: -fno-legacy-pass-manager
15+
16+
/// For full/Thin LTO, -fno-legacy-pass-manager passes -plugin-opt=new-pass-manager to the linker (which may not be LLD).
17+
// RUN: %clang -### -target x86_64-linux -flto -fno-legacy-pass-manager %s 2>&1 | FileCheck --check-prefix=LTO_NEW %s
18+
// RUN: %clang -### -target x86_64-linux -flto=thin -fexperimental-new-pass-manager %s 2>&1 | FileCheck --check-prefix=LTO_NEW %s
19+
20+
// LTO_NEW: "-plugin-opt=new-pass-manager"
21+
22+
// RUN: %clang -### -target x86_64-linux -flto -flegacy-pass-manager %s 2>&1 | FileCheck --check-prefix=LTO_LEGACY %s
23+
// RUN: %clang -### -target x86_64-linux -flto=thin -fno-experimental-new-pass-manager %s 2>&1 | FileCheck --check-prefix=LTO_LEGACY %s
24+
25+
// LTO_LEGACY: "-plugin-opt=legacy-pass-manager"
26+
27+
// RUN: %clang -### -target x86_64-linux -flto %s 2>&1 | FileCheck --check-prefix=DEFAULT %s
28+
//
29+
// DEFAULT-NOT: "-plugin-opt=new-pass-manager"
30+
// DEFAULT-NOT: "-plugin-opt=legacy-pass-manager"

clang/test/Driver/gold-lto-new-pass-man.c

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)