diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -352,10 +352,6 @@ PM.add(createStackSafetyGlobalInfoWrapperPass(/*SetMetadata=*/true)); } -static TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple) { - return new TargetLibraryInfoImpl(TargetTriple); -} - static void addSymbolRewriterPass(const CodeGenOptions &Opts, legacy::PassManager *MPM) { llvm::SymbolRewriter::RewriteDescriptorList DL; @@ -541,12 +537,12 @@ if (CodeGenOpts.DisableLLVMPasses) return; - // Figure out TargetLibraryInfo. This needs to be added to MPM and FPM + // Figure out TargetLibraryInfo. This needs to be added to MPM and FPM // manually (and not via PMBuilder), since some passes (eg. InstrProfiling) // are inserted before PMBuilder ones - they'd get the default-constructed // TLI with an unknown target otherwise. Triple TargetTriple(TheModule->getTargetTriple()); - std::unique_ptr TLII(createTLII(TargetTriple)); + TargetLibraryInfoImpl TLII(TargetTriple); // If we reached here with a non-empty index file name, then the index file // was empty and we are not performing ThinLTO backend compilation (used in @@ -591,7 +587,7 @@ PMBuilder.PrepareForLTO = CodeGenOpts.PrepareForLTO; PMBuilder.RerollLoops = CodeGenOpts.RerollLoops; - MPM.add(new TargetLibraryInfoWrapperPass(*TLII)); + MPM.add(new TargetLibraryInfoWrapperPass(TLII)); if (TM) TM->adjustPassManager(PMBuilder); @@ -692,7 +688,7 @@ } // Set up the per-function pass manager. - FPM.add(new TargetLibraryInfoWrapperPass(*TLII)); + FPM.add(new TargetLibraryInfoWrapperPass(TLII)); if (CodeGenOpts.VerifyModule) FPM.add(createVerifierPass()); @@ -788,8 +784,7 @@ raw_pwrite_stream *DwoOS) { // Add LibraryInfo. llvm::Triple TargetTriple(TheModule->getTargetTriple()); - std::unique_ptr TLII(createTLII(TargetTriple)); - CodeGenPasses.add(new TargetLibraryInfoWrapperPass(*TLII)); + CodeGenPasses.add(new TargetLibraryInfoWrapperPass(TargetTriple)); // Normal mode, emit a .s or .o file by running the code generator. Note, // this also adds codegenerator level optimization passes. @@ -1124,8 +1119,7 @@ // Register the target library analysis directly and give it a customized // preset TLI. Triple TargetTriple(TheModule->getTargetTriple()); - std::unique_ptr TLII(createTLII(TargetTriple)); - FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); }); + FAM.registerPass([&] { return TargetLibraryAnalysis(TargetTriple); }); // Register all the basic analyses with the managers. PB.registerModuleAnalyses(MAM); diff --git a/llvm/include/llvm/Analysis/TargetLibraryInfo.h b/llvm/include/llvm/Analysis/TargetLibraryInfo.h --- a/llvm/include/llvm/Analysis/TargetLibraryInfo.h +++ b/llvm/include/llvm/Analysis/TargetLibraryInfo.h @@ -452,7 +452,11 @@ /// Construct a library analysis with baseline Module-level info. /// /// This will be supplemented with Function-specific info in the Result. - TargetLibraryAnalysis(TargetLibraryInfoImpl BaselineInfoImpl) + TargetLibraryAnalysis(const Triple &T) + : BaselineInfoImpl(TargetLibraryInfoImpl(T)) {} + TargetLibraryAnalysis(const TargetLibraryInfoImpl &BaselineInfoImpl) + : BaselineInfoImpl(BaselineInfoImpl) {} + TargetLibraryAnalysis(TargetLibraryInfoImpl &&BaselineInfoImpl) : BaselineInfoImpl(std::move(BaselineInfoImpl)) {} TargetLibraryInfo run(const Function &F, FunctionAnalysisManager &); @@ -475,6 +479,7 @@ TargetLibraryInfoWrapperPass(); explicit TargetLibraryInfoWrapperPass(const Triple &T); explicit TargetLibraryInfoWrapperPass(const TargetLibraryInfoImpl &TLI); + explicit TargetLibraryInfoWrapperPass(TargetLibraryInfoImpl &&TLI); TargetLibraryInfo &getTLI(const Function &F) { FunctionAnalysisManager DummyFAM; diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp --- a/llvm/lib/Analysis/TargetLibraryInfo.cpp +++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp @@ -583,8 +583,8 @@ ShouldSignExtI32Param(TLI.ShouldSignExtI32Param) { std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray), AvailableArray); - for (unsigned i = 0; i < NumVecLibs; i++) - VecLibDescs[i] = TLI.VecLibDescs[i]; + std::move(std::begin(TLI.VecLibDescs), std::end(TLI.VecLibDescs), + VecLibDescs); } TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(const TargetLibraryInfoImpl &TLI) { @@ -593,6 +593,8 @@ ShouldExtI32Return = TLI.ShouldExtI32Return; ShouldSignExtI32Param = TLI.ShouldSignExtI32Param; memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray)); + for (unsigned i = 0; i < NumVecLibs; i++) + VecLibDescs[i] = TLI.VecLibDescs[i]; return *this; } @@ -603,6 +605,8 @@ ShouldSignExtI32Param = TLI.ShouldSignExtI32Param; std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray), AvailableArray); + std::move(std::begin(TLI.VecLibDescs), std::end(TLI.VecLibDescs), + VecLibDescs); return *this; } @@ -1677,6 +1681,12 @@ initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry()); } +TargetLibraryInfoWrapperPass::TargetLibraryInfoWrapperPass( + TargetLibraryInfoImpl &&TLIImpl) + : ImmutablePass(ID), TLA(std::move(TLIImpl)) { + initializeTargetLibraryInfoWrapperPassPass(*PassRegistry::getPassRegistry()); +} + AnalysisKey TargetLibraryAnalysis::Key; // Register the basic pass.