xref: /llvm-project/llvm/tools/llvm-reduce/deltas/RunIRPasses.cpp (revision 4f14bfeddedcf21e0eaf0ff3ddf7b62938f66df5)
1bd1f80f5SArthur Eubanks //===- RunIRPasses.cpp ----------------------------------------------------===//
2bd1f80f5SArthur Eubanks //
3bd1f80f5SArthur Eubanks // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bd1f80f5SArthur Eubanks // See https://llvm.org/LICENSE.txt for license information.
5bd1f80f5SArthur Eubanks // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bd1f80f5SArthur Eubanks //
7bd1f80f5SArthur Eubanks //===----------------------------------------------------------------------===//
8bd1f80f5SArthur Eubanks 
9bd1f80f5SArthur Eubanks #include "RunIRPasses.h"
10bd1f80f5SArthur Eubanks #include "Delta.h"
11bd1f80f5SArthur Eubanks #include "llvm/Passes/PassBuilder.h"
12bd1f80f5SArthur Eubanks #include "llvm/Support/CommandLine.h"
13bd1f80f5SArthur Eubanks #include "llvm/Support/ErrorHandling.h"
14bd1f80f5SArthur Eubanks 
15bd1f80f5SArthur Eubanks using namespace llvm;
16bd1f80f5SArthur Eubanks 
17e49f8eefSRoman Lebedev extern cl::OptionCategory LLVMReduceOptions;
18e49f8eefSRoman Lebedev 
19*4f14bfedSNikita Popov static cl::opt<std::string>
20*4f14bfedSNikita Popov     PassPipeline("ir-passes",
21bd1f80f5SArthur Eubanks                  cl::desc("A textual description of the pass pipeline, same as "
22bd1f80f5SArthur Eubanks                           "what's passed to `opt -passes`."),
23*4f14bfedSNikita Popov                  cl::init("function(sroa,instcombine<no-verify-fixpoint>,gvn,"
24*4f14bfedSNikita Popov                           "simplifycfg,infer-address-spaces)"),
25e49f8eefSRoman Lebedev                  cl::cat(LLVMReduceOptions));
26bd1f80f5SArthur Eubanks 
2723cc36e4SMatt Arsenault static void runPasses(Oracle &O, ReducerWorkItem &WorkItem) {
2823cc36e4SMatt Arsenault   Module &Program = WorkItem.getModule();
29bd1f80f5SArthur Eubanks   LoopAnalysisManager LAM;
30bd1f80f5SArthur Eubanks   FunctionAnalysisManager FAM;
31bd1f80f5SArthur Eubanks   CGSCCAnalysisManager CGAM;
32bd1f80f5SArthur Eubanks   ModuleAnalysisManager MAM;
33bd1f80f5SArthur Eubanks 
34bd1f80f5SArthur Eubanks   PassInstrumentationCallbacks PIC;
35bd1f80f5SArthur Eubanks   PIC.registerShouldRunOptionalPassCallback(
3619158eb7SSebastian Neubauer       [&](StringRef, Any) { return !O.shouldKeep(); });
37b4482f7cSKazu Hirata   PassBuilder PB(nullptr, PipelineTuningOptions(), std::nullopt, &PIC);
38bd1f80f5SArthur Eubanks 
39bd1f80f5SArthur Eubanks   PB.registerModuleAnalyses(MAM);
40bd1f80f5SArthur Eubanks   PB.registerCGSCCAnalyses(CGAM);
41bd1f80f5SArthur Eubanks   PB.registerFunctionAnalyses(FAM);
42bd1f80f5SArthur Eubanks   PB.registerLoopAnalyses(LAM);
43bd1f80f5SArthur Eubanks   PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
44bd1f80f5SArthur Eubanks 
45bd1f80f5SArthur Eubanks   ModulePassManager MPM;
46bd1f80f5SArthur Eubanks   if (auto Err = PB.parsePassPipeline(MPM, PassPipeline)) {
47bd1f80f5SArthur Eubanks     errs() << toString(std::move(Err)) << "\n";
48bd1f80f5SArthur Eubanks     report_fatal_error("Error constructing pass pipeline");
49bd1f80f5SArthur Eubanks   }
50bd1f80f5SArthur Eubanks   MPM.run(Program, MAM);
51bd1f80f5SArthur Eubanks }
52bd1f80f5SArthur Eubanks 
53bd1f80f5SArthur Eubanks void llvm::runIRPassesDeltaPass(TestRunner &Test) {
542592ccdeSArthur Eubanks   runDeltaPass(Test, runPasses, "Running passes");
55bd1f80f5SArthur Eubanks }
56