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