Index: include/llvm/Target/TargetMachine.h =================================================================== --- include/llvm/Target/TargetMachine.h +++ include/llvm/Target/TargetMachine.h @@ -24,6 +24,7 @@ namespace llvm { +class Function; class GlobalValue; class MachineModuleInfo; class Mangler; @@ -38,6 +39,7 @@ class Target; class TargetIntrinsicInfo; class TargetIRAnalysis; +class TargetTransformInfo; class TargetLoweringObjectFile; class TargetPassConfig; class TargetSubtargetInfo; @@ -204,7 +206,10 @@ /// This is used to construct the new pass manager's target IR analysis pass, /// set up appropriately for this target machine. Even the old pass manager /// uses this to answer queries about the IR. - virtual TargetIRAnalysis getTargetIRAnalysis(); + TargetIRAnalysis getTargetIRAnalysis(); + + virtual std::function + getTargetTransformInfoFactory(); /// Allow the target to modify the pass manager, e.g. by calling /// PassManagerBuilder::addExtension. @@ -280,11 +285,8 @@ void initAsmInfo(); public: - /// \brief Get a TargetIRAnalysis implementation for the target. - /// - /// This analysis will produce a TTI result which uses the common code - /// generator to answer queries about the IR. - TargetIRAnalysis getTargetIRAnalysis() override; + virtual std::function + getTargetTransformInfoFactory() override; /// Create a pass configuration object to be used by addPassToEmitX methods /// for generating a pipeline of CodeGen passes. Index: lib/CodeGen/LLVMTargetMachine.cpp =================================================================== --- lib/CodeGen/LLVMTargetMachine.cpp +++ lib/CodeGen/LLVMTargetMachine.cpp @@ -81,10 +81,11 @@ this->OptLevel = OL; } -TargetIRAnalysis LLVMTargetMachine::getTargetIRAnalysis() { - return TargetIRAnalysis([this](const Function &F) { +std::function +LLVMTargetMachine::getTargetTransformInfoFactory() { + return [this](const Function &F) { return TargetTransformInfo(BasicTTIImpl(this, F)); - }); + }; } /// addPassesToX helper drives creation and initialization of TargetPassConfig. Index: lib/Target/TargetMachine.cpp =================================================================== --- lib/Target/TargetMachine.cpp +++ lib/Target/TargetMachine.cpp @@ -219,10 +219,11 @@ void TargetMachine::setOptLevel(CodeGenOpt::Level Level) { OptLevel = Level; } -TargetIRAnalysis TargetMachine::getTargetIRAnalysis() { - return TargetIRAnalysis([](const Function &F) { +std::function +TargetMachine::getTargetTransformInfoFactory() { + return [](const Function &F) { return TargetTransformInfo(F.getParent()->getDataLayout()); - }); + }; } void TargetMachine::getNameWithPrefix(SmallVectorImpl &Name, @@ -244,3 +245,7 @@ getNameWithPrefix(NameStr, GV, TLOF->getMangler()); return TLOF->getContext().getOrCreateSymbol(NameStr); } + +TargetIRAnalysis TargetMachine::getTargetIRAnalysis() { + return TargetIRAnalysis(getTargetTransformInfoFactory()); +} Index: lib/Target/X86/X86TargetMachine.h =================================================================== --- lib/Target/X86/X86TargetMachine.h +++ lib/Target/X86/X86TargetMachine.h @@ -45,7 +45,8 @@ // attributes of each function. const X86Subtarget *getSubtargetImpl() const = delete; - TargetIRAnalysis getTargetIRAnalysis() override; + std::function + getTargetTransformInfoFactory() override; // Set up the pass pipeline. TargetPassConfig *createPassConfig(PassManagerBase &PM) override; Index: lib/Target/X86/X86TargetMachine.cpp =================================================================== --- lib/Target/X86/X86TargetMachine.cpp +++ lib/Target/X86/X86TargetMachine.cpp @@ -281,10 +281,11 @@ // X86 TTI query. //===----------------------------------------------------------------------===// -TargetIRAnalysis X86TargetMachine::getTargetIRAnalysis() { - return TargetIRAnalysis([this](const Function &F) { +std::function +X86TargetMachine::getTargetTransformInfoFactory() { + return [this](const Function &F) { return TargetTransformInfo(X86TTIImpl(this, F)); - }); + }; } //===----------------------------------------------------------------------===//