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