Enzyme main
Loading...
Searching...
No Matches
EnzymePassLoader.cpp
Go to the documentation of this file.
1//===- EnzymePassLoader.cpp - Automatic Differentiation Transformation
2// Pass---===//
3//
4// Enzyme Project
5//
6// Part of the Enzyme Project, under the Apache License v2.0 with LLVM
7// Exceptions. See https://llvm.org/LICENSE.txt for license information.
8// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
9//
10// If using this code in an academic setting, please cite the following:
11// @incollection{enzymeNeurips,
12// title = {Instead of Rewriting Foreign Code for Machine Learning,
13// Automatically Synthesize Fast Gradients},
14// author = {Moses, William S. and Churavy, Valentin},
15// booktitle = {Advances in Neural Information Processing Systems 33},
16// year = {2020},
17// note = {To appear in},
18// }
19//
20//===----------------------------------------------------------------------===//
21//
22// This file contains a clang plugin for Enzyme.
23//
24//===----------------------------------------------------------------------===//
25
26#include "llvm/Config/llvm-config.h"
27
28#if LLVM_VERSION_MAJOR < 16
29
30#include "llvm/IR/LegacyPassManager.h"
31#include "llvm/Support/CommandLine.h"
32#include "llvm/Transforms/IPO.h"
33#include "llvm/Transforms/IPO/PassManagerBuilder.h"
34#include "llvm/Transforms/Scalar.h"
35#include "llvm/Transforms/Scalar/GVN.h"
36
37#include "../Enzyme.h"
38#include "../PreserveNVVM.h"
39
40extern llvm::cl::opt<bool> EnzymeEnable;
41
42using namespace llvm;
43
44// This function is of type PassManagerBuilder::ExtensionFn
45static void loadPass(const PassManagerBuilder &Builder,
46 legacy::PassManagerBase &PM) {
47 if (!EnzymeEnable)
48 return;
49 PM.add(createPreserveNVVMPass(/*Begin=*/true));
50 PM.add(createGVNPass());
51 PM.add(createSROAPass());
52 PM.add(createEnzymePass(/*PostOpt*/ true));
53 PM.add(createPreserveNVVMPass(/*Begin=*/false));
54 PM.add(createGVNPass());
55 PM.add(createSROAPass());
56 PM.add(createLoopDeletionPass());
57 PM.add(createGlobalOptimizerPass());
58 // PM.add(SimplifyCFGPass());
59}
60
61static void loadNVVMPass(const PassManagerBuilder &Builder,
62 legacy::PassManagerBase &PM) {
63 PM.add(createPreserveNVVMFnPass(/*Begin=*/true));
64}
65
66// These constructors add our pass to a list of global extensions.
67static RegisterStandardPasses
68 clangtoolLoader_Ox(PassManagerBuilder::EP_VectorizerStart, loadPass);
69static RegisterStandardPasses
70 clangtoolLoader_O0(PassManagerBuilder::EP_EnabledOnOptLevel0, loadPass);
71static RegisterStandardPasses
72 clangtoolLoader_OEarly(PassManagerBuilder::EP_EarlyAsPossible,
74
75static void loadLTOPass(const PassManagerBuilder &Builder,
76 legacy::PassManagerBase &PM) {
77 if (!EnzymeEnable)
78 return;
79 loadPass(Builder, PM);
80 PassManagerBuilder Builder2 = Builder;
81 Builder2.Inliner = nullptr;
82 Builder2.LibraryInfo = nullptr;
83 Builder2.ExportSummary = nullptr;
84 Builder2.ImportSummary = nullptr;
85 /*
86 Builder2.LoopVectorize = false;
87 Builder2.SLPVectorize = false;
88 Builder2.DisableUnrollLoops = true;
89 Builder2.RerollLoops = true;
90 */
91 const_cast<PassManagerBuilder &>(Builder2).populateModulePassManager(PM);
92}
93
94static RegisterStandardPasses
95 clangtoolLoader_LTO(PassManagerBuilder::EP_FullLinkTimeOptimizationEarly,
97
98#endif // LLVM_VERSION_MAJOR < 16
static void loadNVVMPass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)
static RegisterStandardPasses clangtoolLoader_LTO(PassManagerBuilder::EP_FullLinkTimeOptimizationEarly, loadLTOPass)
static RegisterStandardPasses clangtoolLoader_Ox(PassManagerBuilder::EP_VectorizerStart, loadPass)
static RegisterStandardPasses clangtoolLoader_OEarly(PassManagerBuilder::EP_EarlyAsPossible, loadNVVMPass)
static void loadLTOPass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)
llvm::cl::opt< bool > EnzymeEnable
static void loadPass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)
static RegisterStandardPasses clangtoolLoader_O0(PassManagerBuilder::EP_EnabledOnOptLevel0, loadPass)
ModulePass * createEnzymePass(bool PostOpt)
Definition Enzyme.cpp:3043
ModulePass * createPreserveNVVMPass(bool Begin)
FunctionPass * createPreserveNVVMFnPass(bool Begin)