11e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. 21e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 31e67c90e2caceeff82d09793d1ef5fa0300d219bPeter HawkinsLicensed under the Apache License, Version 2.0 (the "License"); 41e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsyou may not use this file except in compliance with the License. 51e67c90e2caceeff82d09793d1ef5fa0300d219bPeter HawkinsYou may obtain a copy of the License at 61e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 71e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins http://www.apache.org/licenses/LICENSE-2.0 81e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 91e67c90e2caceeff82d09793d1ef5fa0300d219bPeter HawkinsUnless required by applicable law or agreed to in writing, software 101e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsdistributed under the License is distributed on an "AS IS" BASIS, 111e67c90e2caceeff82d09793d1ef5fa0300d219bPeter HawkinsWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121e67c90e2caceeff82d09793d1ef5fa0300d219bPeter HawkinsSee the License for the specific language governing permissions and 131e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinslimitations under the License. 141e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins==============================================================================*/ 151e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 161e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#ifndef TENSORFLOW_COMPILER_XLA_SERVICE_CPU_COMPILER_FUNCTOR_H_ 171e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#define TENSORFLOW_COMPILER_XLA_SERVICE_CPU_COMPILER_FUNCTOR_H_ 181e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 1934cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/IR/LegacyPassManager.h" 2034cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/IR/Module.h" 2134cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/Object/ObjectFile.h" 2234cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/Target/TargetMachine.h" 231e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#include "tensorflow/compiler/xla/service/cpu/disassembler.h" 24cc1dae40c565d365e8ce381280290458d6ce092eA. Unique TensorFlower#include "tensorflow/compiler/xla/service/llvm_compiler.h" 251e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#include "tensorflow/core/platform/logging.h" 261e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 271e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsnamespace xla { 281e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsnamespace cpu { 291e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 301e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins// Functor class for compiling an LLVM module down to an object file. For use by 311e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins// Orc JIT compile layer. 321e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsclass CompilerFunctor { 331e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins public: 34cc1dae40c565d365e8ce381280290458d6ce092eA. Unique TensorFlower explicit CompilerFunctor( 35cc1dae40c565d365e8ce381280290458d6ce092eA. Unique TensorFlower llvm::TargetMachine* target_machine, const Disassembler* disassembler, 36c0f9b0a91e9e203dffcad0ec1d75a00112b60e5bA. Unique TensorFlower int opt_level, bool optimize_for_size, bool enable_fast_math, 37fa75ba9c8706919df836c569a0f6d4e60d8a01d6A. Unique TensorFlower bool disable_expensive_passes, 38cc1dae40c565d365e8ce381280290458d6ce092eA. Unique TensorFlower LLVMCompiler::ModuleHook pre_optimization_hook = nullptr, 39cc1dae40c565d365e8ce381280290458d6ce092eA. Unique TensorFlower LLVMCompiler::ModuleHook post_optimization_hook = nullptr) 401e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins : target_machine_(target_machine), 411e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins disassembler_(CHECK_NOTNULL(disassembler)), 421e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins opt_level_(opt_level), 4336725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower optimize_for_size_(optimize_for_size), 44c0f9b0a91e9e203dffcad0ec1d75a00112b60e5bA. Unique TensorFlower enable_fast_math_(enable_fast_math), 45fa75ba9c8706919df836c569a0f6d4e60d8a01d6A. Unique TensorFlower disable_expensive_passes_(disable_expensive_passes), 46201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower pre_optimization_hook_(pre_optimization_hook), 47201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower post_optimization_hook_(post_optimization_hook) {} 481e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 491e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins // Compile a Module to an ObjectFile. 501e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins llvm::object::OwningBinary<llvm::object::ObjectFile> operator()( 511e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins llvm::Module& module) const; // NOLINT 521e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 531e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins private: 5436725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower // Populates the given pass manager with TargetLibraryInfo and 5536725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower // TargetTransformInfo passes. 5636725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower void AddTargetInfoPasses(llvm::legacy::PassManagerBase* passes) const; 5736725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower 581e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins // Populates the given pass managers based on the optimization level. 5936725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower void AddOptimizationPasses(llvm::legacy::PassManagerBase* module_passes, 6036725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower llvm::legacy::FunctionPassManager* function_passes, 6136725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower unsigned opt_level, unsigned size_level) const; 621e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 631e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins llvm::TargetMachine* target_machine_; 641e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins const Disassembler* disassembler_; 651e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins const unsigned opt_level_; 6636725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower const bool optimize_for_size_; 67c0f9b0a91e9e203dffcad0ec1d75a00112b60e5bA. Unique TensorFlower const bool enable_fast_math_; 68fa75ba9c8706919df836c569a0f6d4e60d8a01d6A. Unique TensorFlower const bool disable_expensive_passes_; 69cc1dae40c565d365e8ce381280290458d6ce092eA. Unique TensorFlower LLVMCompiler::ModuleHook pre_optimization_hook_; 70cc1dae40c565d365e8ce381280290458d6ce092eA. Unique TensorFlower LLVMCompiler::ModuleHook post_optimization_hook_; 711e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins}; 721e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 731e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins} // namespace cpu 741e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins} // namespace xla 751e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 761e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#endif // TENSORFLOW_COMPILER_XLA_SERVICE_CPU_COMPILER_FUNCTOR_H_ 77