From 276f40540766ad0cfadbf744e0eb58499f60238a Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Sun, 1 Feb 2015 12:26:09 +0000 Subject: [PATCH] [multiversion] Implement the old pass manager's TTI wrapper pass in terms of the new pass manager's TargetIRAnalysis. Yep, this is one of the nicer bits of the new pass manager's design. Passes can in many cases operate in a vacuum and so we can just nest things when convenient. This is particularly convenient here as I can now consolidate all of the TargetMachine logic on this analysis. The most important change here is that this pushes the function we need TTI for all the way into the TargetMachine, and re-creates the TTI object for each function rather than re-using it for each function. We're now prepared to teach the targets to produce function-specific TTI objects with specific subtargets cached, etc. One piece of feedback I'd love here is whether its worth renaming any of this stuff. None of the names really seem that awesome to me at this point, but TargetTransformInfoWrapperPass is particularly ... odd. TargetIRAnalysisWrapper might make more sense. I would want to do that rename separately anyways, but let me know what you think. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227731 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/TargetTransformInfo.h | 10 ++++++---- lib/Analysis/TargetTransformInfo.cpp | 17 +++++++++++------ lib/CodeGen/LLVMTargetMachine.cpp | 2 +- lib/LTO/LTOCodeGenerator.cpp | 3 ++- lib/Target/TargetMachineC.cpp | 3 ++- tools/opt/opt.cpp | 6 +++--- 6 files changed, 25 insertions(+), 16 deletions(-) diff --git a/include/llvm/Analysis/TargetTransformInfo.h b/include/llvm/Analysis/TargetTransformInfo.h index affa9336e1f..1d3db7bfe45 100644 --- a/include/llvm/Analysis/TargetTransformInfo.h +++ b/include/llvm/Analysis/TargetTransformInfo.h @@ -22,6 +22,7 @@ #ifndef LLVM_ANALYSIS_TARGETTRANSFORMINFO_H #define LLVM_ANALYSIS_TARGETTRANSFORMINFO_H +#include "llvm/ADT/Optional.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/Pass.h" @@ -791,7 +792,8 @@ private: /// This pass can be constructed from a TTI object which it stores internally /// and is queried by passes. class TargetTransformInfoWrapperPass : public ImmutablePass { - TargetTransformInfo TTI; + TargetIRAnalysis TIRA; + Optional TTI; virtual void anchor(); @@ -804,16 +806,16 @@ public: /// Use the constructor below or call one of the creation routines. TargetTransformInfoWrapperPass(); - explicit TargetTransformInfoWrapperPass(TargetTransformInfo TTI); + explicit TargetTransformInfoWrapperPass(TargetIRAnalysis TIRA); - TargetTransformInfo &getTTI(Function &F) { return TTI; } + TargetTransformInfo &getTTI(Function &F); }; /// \brief Create an analysis pass wrapper around a TTI object. /// /// This analysis pass just holds the TTI instance and makes it available to /// clients. -ImmutablePass *createTargetTransformInfoWrapperPass(TargetTransformInfo TTI); +ImmutablePass *createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA); } // End llvm namespace diff --git a/lib/Analysis/TargetTransformInfo.cpp b/lib/Analysis/TargetTransformInfo.cpp index 6bd79f667b4..d51cfb347ff 100644 --- a/lib/Analysis/TargetTransformInfo.cpp +++ b/lib/Analysis/TargetTransformInfo.cpp @@ -280,19 +280,24 @@ char TargetTransformInfoWrapperPass::ID = 0; void TargetTransformInfoWrapperPass::anchor() {} TargetTransformInfoWrapperPass::TargetTransformInfoWrapperPass() - : ImmutablePass(ID), TTI(NoTTIImpl(/*DataLayout*/ nullptr)) { + : ImmutablePass(ID) { initializeTargetTransformInfoWrapperPassPass( *PassRegistry::getPassRegistry()); } TargetTransformInfoWrapperPass::TargetTransformInfoWrapperPass( - TargetTransformInfo TTI) - : ImmutablePass(ID), TTI(std::move(TTI)) { + TargetIRAnalysis TIRA) + : ImmutablePass(ID), TIRA(std::move(TIRA)) { initializeTargetTransformInfoWrapperPassPass( *PassRegistry::getPassRegistry()); } -ImmutablePass * -llvm::createTargetTransformInfoWrapperPass(TargetTransformInfo TTI) { - return new TargetTransformInfoWrapperPass(std::move(TTI)); +TargetTransformInfo &TargetTransformInfoWrapperPass::getTTI(Function &F) { + TTI = TIRA.run(F); + return *TTI; +} + +ImmutablePass * +llvm::createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA) { + return new TargetTransformInfoWrapperPass(std::move(TIRA)); } diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index f7377c858f3..fd242b36045 100644 --- a/lib/CodeGen/LLVMTargetMachine.cpp +++ b/lib/CodeGen/LLVMTargetMachine.cpp @@ -90,7 +90,7 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM, AnalysisID StopAfter) { // Add internal analysis passes from the target machine. - PM.add(createTargetTransformInfoWrapperPass(TM->getTTI())); + PM.add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis())); // Targets may override createPassConfig to provide a target-specific // subclass. diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index feea6570a31..27b87764065 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -490,7 +490,8 @@ bool LTOCodeGenerator::generateObjectFile(raw_ostream &out, mergedModule->setDataLayout(TargetMach->getDataLayout()); passes.add(new DataLayoutPass()); - passes.add(createTargetTransformInfoWrapperPass(TargetMach->getTTI())); + passes.add( + createTargetTransformInfoWrapperPass(TargetMach->getTargetIRAnalysis())); Triple TargetTriple(TargetMach->getTargetTriple()); PassManagerBuilder PMB; diff --git a/lib/Target/TargetMachineC.cpp b/lib/Target/TargetMachineC.cpp index 9d759a3e644..8be10cb3262 100644 --- a/lib/Target/TargetMachineC.cpp +++ b/lib/Target/TargetMachineC.cpp @@ -256,5 +256,6 @@ char *LLVMGetDefaultTargetTriple(void) { } void LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM) { - unwrap(PM)->add(createTargetTransformInfoWrapperPass(unwrap(T)->getTTI())); + unwrap(PM)->add( + createTargetTransformInfoWrapperPass(unwrap(T)->getTargetIRAnalysis())); } diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index af2cdd82460..00337ded99a 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -427,8 +427,8 @@ int main(int argc, char **argv) { Passes.add(new DataLayoutPass()); // Add internal analysis passes from the target machine. - Passes.add(createTargetTransformInfoWrapperPass( - TM ? TM->getTTI() : TargetTransformInfo(DL))); + Passes.add(createTargetTransformInfoWrapperPass(TM ? TM->getTargetIRAnalysis() + : TargetIRAnalysis())); std::unique_ptr FPasses; if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) { @@ -436,7 +436,7 @@ int main(int argc, char **argv) { if (DL) FPasses->add(new DataLayoutPass()); FPasses->add(createTargetTransformInfoWrapperPass( - TM ? TM->getTTI() : TargetTransformInfo(DL))); + TM ? TM->getTargetIRAnalysis() : TargetIRAnalysis())); } if (PrintBreakpoints) {