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