compiler_functor.h revision 34cbf161d7b1191ad5c1b3bc02fc52d338e8b175
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" 241e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#include "tensorflow/core/platform/logging.h" 251e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 261e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsnamespace xla { 271e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsnamespace cpu { 281e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 291e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins// Functor class for compiling an LLVM module down to an object file. For use by 301e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins// Orc JIT compile layer. 311e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsclass CompilerFunctor { 321e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins public: 331e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins // Describes the set of vector intrinsics available to the generated code. 341e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins struct VectorIntrinsics { 351e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins bool sse_intrinsics; 361e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins bool avx_intrinsics; 371e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins }; 381e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 391e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins // Returns a VectorIntrinsics where all intrinsics are available. 401e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins static VectorIntrinsics AllIntrinsics(); 411e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 42a223edf9026f00f8b1c994b6f09664b7d40d69b0A. Unique TensorFlower // A callback of this type can be run before and/or after IR-level 43a223edf9026f00f8b1c994b6f09664b7d40d69b0A. Unique TensorFlower // optimization to e.g. dump out the generated IR to disk or gather some 44a223edf9026f00f8b1c994b6f09664b7d40d69b0A. Unique TensorFlower // statistics. 45201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower using ModuleHook = std::function<Status(const llvm::Module&)>; 46a223edf9026f00f8b1c994b6f09664b7d40d69b0A. Unique TensorFlower 47201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower explicit CompilerFunctor(llvm::TargetMachine* target_machine, 48201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower const Disassembler* disassembler, int opt_level, 49201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower const VectorIntrinsics& available_intrinsics, 50201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower ModuleHook pre_optimization_hook = nullptr, 51201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower ModuleHook post_optimization_hook = nullptr) 521e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins : target_machine_(target_machine), 531e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins disassembler_(CHECK_NOTNULL(disassembler)), 541e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins opt_level_(opt_level), 55a223edf9026f00f8b1c994b6f09664b7d40d69b0A. Unique TensorFlower available_intrinsics_(available_intrinsics), 56201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower pre_optimization_hook_(pre_optimization_hook), 57201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower post_optimization_hook_(post_optimization_hook) {} 581e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 591e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins // Compile a Module to an ObjectFile. 601e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins llvm::object::OwningBinary<llvm::object::ObjectFile> operator()( 611e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins llvm::Module& module) const; // NOLINT 621e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 631e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins private: 641e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins // Populates the given pass managers based on the optimization level. 651e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins void AddOptimizationPasses( 661e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins llvm::legacy::PassManagerBase* module_passes, 671e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins llvm::legacy::FunctionPassManager* function_passes) const; 681e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 691e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins llvm::TargetMachine* target_machine_; 701e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins const Disassembler* disassembler_; 711e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins const unsigned opt_level_; 721e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins const VectorIntrinsics available_intrinsics_; 73201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower ModuleHook pre_optimization_hook_; 74201fa224e178b76ece4723c433a17df10005341cA. Unique TensorFlower ModuleHook post_optimization_hook_; 751e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins}; 761e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 771e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins} // namespace cpu 781e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins} // namespace xla 791e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 801e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#endif // TENSORFLOW_COMPILER_XLA_SERVICE_CPU_COMPILER_FUNCTOR_H_ 81