Author: Arthur Eubanks Date: 2022-11-24T08:57:19-08:00 New Revision: d75bd5e8bb62eddaccc256eef4e10130d6018ec8
URL: https://github.com/llvm/llvm-project/commit/d75bd5e8bb62eddaccc256eef4e10130d6018ec8 DIFF: https://github.com/llvm/llvm-project/commit/d75bd5e8bb62eddaccc256eef4e10130d6018ec8.diff LOG: Revert "[clang-fuzzer] Use new pass manager for optimizing IR" This reverts commit a46a746cfa08a72f9e9188451ed5cac2f77d5237. Breaks bots, e.g. https://lab.llvm.org/buildbot#builders/121/builds/25511. Added: Modified: clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp Removed: ################################################################################ diff --git a/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp b/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp index 5c9066c148d61..aa38b5e4aa26e 100644 --- a/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp +++ b/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp @@ -30,28 +30,34 @@ #include "llvm/ExecutionEngine/SectionMemoryManager.h" #include "llvm/IR/IRPrintingPasses.h" #include "llvm/IR/LLVMContext.h" +#include "llvm/IR/LegacyPassManager.h" +#include "llvm/IR/LegacyPassNameParser.h" #include "llvm/IR/Module.h" #include "llvm/IR/Verifier.h" -#include "llvm/IRPrinter/IRPrintingPasses.h" #include "llvm/IRReader/IRReader.h" #include "llvm/MC/TargetRegistry.h" -#include "llvm/Passes/OptimizationLevel.h" -#include "llvm/Passes/PassBuilder.h" +#include "llvm/Pass.h" +#include "llvm/PassRegistry.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Transforms/IPO.h" +#include "llvm/Transforms/IPO/PassManagerBuilder.h" +#include "llvm/Transforms/Vectorize.h" using namespace llvm; +static codegen::RegisterCodeGenFlags CGF; + // Define a type for the functions that are compiled and executed typedef void (*LLVMFunc)(int*, int*, int*, int); // Helper function to parse command line args and find the optimization level -static CodeGenOpt::Level -getOptLevel(const std::vector<const char *> &ExtraArgs) { +static void getOptLevel(const std::vector<const char *> &ExtraArgs, + CodeGenOpt::Level &OLvl) { // Find the optimization level from the command line args - CodeGenOpt::Level OLvl = CodeGenOpt::Default; + OLvl = CodeGenOpt::Default; for (auto &A : ExtraArgs) { if (A[0] == '-' && A[1] == 'O') { switch(A[2]) { @@ -65,7 +71,6 @@ getOptLevel(const std::vector<const char *> &ExtraArgs) { } } } - return OLvl; } static void ErrorAndExit(std::string message) { @@ -75,45 +80,16 @@ static void ErrorAndExit(std::string message) { // Helper function to add optimization passes to the TargetMachine at the // specified optimization level, OptLevel -static void RunOptimizationPasses(raw_ostream &OS, Module &M, - CodeGenOpt::Level OptLevel) { - llvm::OptimizationLevel OL; - switch (OptLevel) { - case CodeGenOpt::None: - OL = OptimizationLevel::O0; - break; - case CodeGenOpt::Less: - OL = OptimizationLevel::O1; - break; - case CodeGenOpt::Default: - OL = OptimizationLevel::O2; - break; - case CodeGenOpt::Aggressive: - OL = OptimizationLevel::O3; - break; - } - - LoopAnalysisManager LAM; - FunctionAnalysisManager FAM; - CGSCCAnalysisManager CGAM; - ModuleAnalysisManager MAM; - - PassBuilder PB; - - PB.registerModuleAnalyses(MAM); - PB.registerCGSCCAnalyses(CGAM); - PB.registerFunctionAnalyses(FAM); - PB.registerLoopAnalyses(LAM); - PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); - - ModulePassManager MPM; - if (OL == OptimizationLevel::O0) - MPM = PB.buildO0DefaultPipeline(OL); - else - MPM = PB.buildPerModuleDefaultPipeline(OL); - MPM.addPass(PrintModulePass(OS)); - - MPM.run(M, MAM); +static void AddOptimizationPasses(legacy::PassManagerBase &MPM, + CodeGenOpt::Level OptLevel, + unsigned SizeLevel) { + // Create and initialize a PassManagerBuilder + PassManagerBuilder Builder; + Builder.OptLevel = OptLevel; + Builder.SizeLevel = SizeLevel; + Builder.Inliner = createFunctionInliningPass(OptLevel, SizeLevel, false); + Builder.LoopVectorize = true; + Builder.populateModulePassManager(MPM); } // Mimics the opt tool to run an optimization pass over the provided IR @@ -144,10 +120,24 @@ static std::string OptLLVM(const std::string &IR, CodeGenOpt::Level OLvl) { codegen::setFunctionAttributes(codegen::getCPUStr(), codegen::getFeaturesStr(), *M); + legacy::PassManager Passes; + + Passes.add(new TargetLibraryInfoWrapperPass(ModuleTriple)); + Passes.add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis())); + + LLVMTargetMachine <M = static_cast<LLVMTargetMachine &>(*TM); + Passes.add(LTM.createPassConfig(Passes)); + + Passes.add(createVerifierPass()); + + AddOptimizationPasses(Passes, OLvl, 0); + // Add a pass that writes the optimized IR to an output stream std::string outString; raw_string_ostream OS(outString); - RunOptimizationPasses(OS, *M, OLvl); + Passes.add(createPrintModulePass(OS, "", false)); + + Passes.run(*M); return outString; } @@ -226,7 +216,8 @@ void clang_fuzzer::HandleLLVM(const std::string &IR, memcpy(UnoptArrays, InputArrays, kTotalSize); // Parse ExtraArgs to set the optimization level - CodeGenOpt::Level OLvl = getOptLevel(ExtraArgs); + CodeGenOpt::Level OLvl; + getOptLevel(ExtraArgs, OLvl); // First we optimize the IR by running a loop vectorizer pass std::string OptIR = OptLLVM(IR, OLvl); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits