Skip to content

Commit 0dba763

Browse files
ZuseZ4tgymnich
andauthored
Lld enzyme (rust-lang#564)
* add initial LLDEnzyme * add License info * adjust CMake package, Co-authored-by: tgymnich <[email protected]> Co-authored-by: tgymnich <[email protected]>
1 parent c61d6d2 commit 0dba763

File tree

5 files changed

+129
-68
lines changed

5 files changed

+129
-68
lines changed

enzyme/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,10 @@ if (${Clang_FOUND})
196196
export(TARGETS ClangEnzyme-${LLVM_VERSION_MAJOR}
197197
APPEND FILE "${PROJECT_BINARY_DIR}/EnzymeTargets.cmake")
198198
endif()
199+
200+
export(TARGETS LLDEnzyme-${LLVM_VERSION_MAJOR}
201+
APPEND FILE "${PROJECT_BINARY_DIR}/EnzymeTargets.cmake")
202+
199203
export(PACKAGE Enzyme)
200204

201205
set(CONF_LLVM_VERSION_MAJOR ${LLVM_VERSION_MAJOR})

enzyme/Enzyme/CMakeLists.txt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,20 @@ if (${LLVM_VERSION_MAJOR} LESS 8)
2222
if (${Clang_FOUND})
2323
add_llvm_loadable_module( ClangEnzyme-${LLVM_VERSION_MAJOR}
2424
${ENZYME_SRC} Clang/EnzymeClang.cpp
25+
Clang/EnzymePassLoader.cpp
2526
DEPENDS
2627
intrinsics_gen
2728
PLUGIN_TOOL
2829
opt
2930
)
3031
endif()
32+
add_llvm_loadable_module( LLDEnzyme-${LLVM_VERSION_MAJOR}
33+
${ENZYME_SRC} Clang/EnzymePassLoader.cpp
34+
DEPENDS
35+
intrinsics_gen
36+
PLUGIN_TOOL
37+
opt
38+
)
3139
else()
3240
# on windows `PLUGIN_TOOL` doesn't link against LLVM.dll
3341
if ((WIN32 OR CYGWIN) AND LLVM_LINK_LLVM_DYLIB)
@@ -42,13 +50,22 @@ if ((WIN32 OR CYGWIN) AND LLVM_LINK_LLVM_DYLIB)
4250
if (${Clang_FOUND})
4351
add_llvm_library( ClangEnzyme-${LLVM_VERSION_MAJOR}
4452
${ENZYME_SRC} Clang/EnzymeClang.cpp
53+
Clang/EnzymePassLoader.cpp
4554
MODULE
4655
DEPENDS
4756
intrinsics_gen
4857
LINK_COMPONENTS
4958
LLVM
5059
)
5160
endif()
61+
add_llvm_library( LLDEnzyme-${LLVM_VERSION_MAJOR}
62+
${ENZYME_SRC} Clang/EnzymePassLoader.cpp
63+
MODULE
64+
DEPENDS
65+
intrinsics_gen
66+
LINK_COMPONENTS
67+
LLVM
68+
)
5269
else()
5370
add_llvm_library( LLVMEnzyme-${LLVM_VERSION_MAJOR}
5471
${ENZYME_SRC}
@@ -61,13 +78,22 @@ else()
6178
if (${Clang_FOUND})
6279
add_llvm_library( ClangEnzyme-${LLVM_VERSION_MAJOR}
6380
${ENZYME_SRC} Clang/EnzymeClang.cpp
81+
Clang/EnzymePassLoader.cpp
6482
MODULE
6583
DEPENDS
6684
intrinsics_gen
6785
PLUGIN_TOOL
6886
opt
6987
)
7088
endif()
89+
add_llvm_library( LLDEnzyme-${LLVM_VERSION_MAJOR}
90+
${ENZYME_SRC} Clang/EnzymePassLoader.cpp
91+
MODULE
92+
DEPENDS
93+
intrinsics_gen
94+
PLUGIN_TOOL
95+
opt
96+
)
7197
endif()
7298
endif()
7399

@@ -92,6 +118,8 @@ if (${Clang_FOUND})
92118
set_target_properties(ClangEnzyme-${LLVM_VERSION_MAJOR} PROPERTIES
93119
LINK_FLAGS "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress")
94120
endif()
121+
set_target_properties(LLDEnzyme-${LLVM_VERSION_MAJOR} PROPERTIES
122+
LINK_FLAGS "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress")
95123
endif()
96124

97125
install(TARGETS LLVMEnzyme-${LLVM_VERSION_MAJOR}
@@ -107,3 +135,8 @@ install(TARGETS ClangEnzyme-${LLVM_VERSION_MAJOR}
107135
PUBLIC_HEADER DESTINATION "${INSTALL_INCLUDE_DIR}/Enzyme"
108136
COMPONENT dev)
109137
endif()
138+
install(TARGETS LLDEnzyme-${LLVM_VERSION_MAJOR}
139+
EXPORT EnzymeTargets
140+
LIBRARY DESTINATION lib COMPONENT shlib
141+
PUBLIC_HEADER DESTINATION "${INSTALL_INCLUDE_DIR}/Enzyme"
142+
COMPONENT dev)

enzyme/Enzyme/Clang/EnzymeClang.cpp

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -22,68 +22,6 @@
2222
//
2323
//===----------------------------------------------------------------------===//
2424

25-
#include "llvm/IR/LegacyPassManager.h"
26-
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
27-
28-
#include "../Enzyme.h"
29-
#include "../PreserveNVVM.h"
30-
31-
#include "llvm/LinkAllPasses.h"
32-
33-
using namespace llvm;
34-
35-
// This function is of type PassManagerBuilder::ExtensionFn
36-
static void loadPass(const PassManagerBuilder &Builder,
37-
legacy::PassManagerBase &PM) {
38-
PM.add(createPreserveNVVMPass(/*Begin=*/true));
39-
PM.add(createGVNPass());
40-
PM.add(createSROAPass());
41-
PM.add(createEnzymePass(/*PostOpt*/ true));
42-
PM.add(createPreserveNVVMPass(/*Begin=*/false));
43-
PM.add(createGVNPass());
44-
PM.add(createSROAPass());
45-
PM.add(createLoopDeletionPass());
46-
PM.add(createGlobalOptimizerPass());
47-
// PM.add(SimplifyCFGPass());
48-
}
49-
50-
static void loadNVVMPass(const PassManagerBuilder &Builder,
51-
legacy::PassManagerBase &PM) {
52-
PM.add(createPreserveNVVMPass(/*Begin=*/true));
53-
}
54-
55-
// These constructors add our pass to a list of global extensions.
56-
static RegisterStandardPasses
57-
clangtoolLoader_Ox(PassManagerBuilder::EP_VectorizerStart, loadPass);
58-
static RegisterStandardPasses
59-
clangtoolLoader_O0(PassManagerBuilder::EP_EnabledOnOptLevel0, loadPass);
60-
static RegisterStandardPasses
61-
clangtoolLoader_OEarly(PassManagerBuilder::EP_EarlyAsPossible,
62-
loadNVVMPass);
63-
64-
#if LLVM_VERSION_MAJOR >= 9
65-
66-
static void loadLTOPass(const PassManagerBuilder &Builder,
67-
legacy::PassManagerBase &PM) {
68-
loadPass(Builder, PM);
69-
PassManagerBuilder Builder2 = Builder;
70-
Builder2.Inliner = nullptr;
71-
Builder2.LibraryInfo = nullptr;
72-
Builder2.ExportSummary = nullptr;
73-
Builder2.ImportSummary = nullptr;
74-
/*
75-
Builder2.LoopVectorize = false;
76-
Builder2.SLPVectorize = false;
77-
Builder2.DisableUnrollLoops = true;
78-
Builder2.RerollLoops = true;
79-
*/
80-
const_cast<PassManagerBuilder &>(Builder2).populateModulePassManager(PM);
81-
}
82-
83-
static RegisterStandardPasses
84-
clangtoolLoader_LTO(PassManagerBuilder::EP_FullLinkTimeOptimizationEarly,
85-
loadLTOPass);
86-
8725
#include "clang/AST/Attr.h"
8826
#include "clang/AST/DeclGroup.h"
8927
#include "clang/Frontend/CompilerInstance.h"
@@ -142,4 +80,3 @@ class EnzymePlugin : public clang::ASTConsumer {
14280
// register the PluginASTAction in the registry.
14381
static clang::FrontendPluginRegistry::Add<EnzymeAction<EnzymePlugin>>
14482
X("enzyme", "Enzyme Plugin");
145-
#endif
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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/IR/LegacyPassManager.h"
27+
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
28+
29+
#include "../Enzyme.h"
30+
#include "../PreserveNVVM.h"
31+
32+
#include "llvm/LinkAllPasses.h"
33+
34+
using namespace llvm;
35+
36+
// This function is of type PassManagerBuilder::ExtensionFn
37+
static void loadPass(const PassManagerBuilder &Builder,
38+
legacy::PassManagerBase &PM) {
39+
PM.add(createPreserveNVVMPass(/*Begin=*/true));
40+
PM.add(createGVNPass());
41+
PM.add(createSROAPass());
42+
PM.add(createEnzymePass(/*PostOpt*/ true));
43+
PM.add(createPreserveNVVMPass(/*Begin=*/false));
44+
PM.add(createGVNPass());
45+
PM.add(createSROAPass());
46+
PM.add(createLoopDeletionPass());
47+
PM.add(createGlobalOptimizerPass());
48+
// PM.add(SimplifyCFGPass());
49+
}
50+
51+
static void loadNVVMPass(const PassManagerBuilder &Builder,
52+
legacy::PassManagerBase &PM) {
53+
PM.add(createPreserveNVVMPass(/*Begin=*/true));
54+
}
55+
56+
// These constructors add our pass to a list of global extensions.
57+
static RegisterStandardPasses
58+
clangtoolLoader_Ox(PassManagerBuilder::EP_VectorizerStart, loadPass);
59+
static RegisterStandardPasses
60+
clangtoolLoader_O0(PassManagerBuilder::EP_EnabledOnOptLevel0, loadPass);
61+
static RegisterStandardPasses
62+
clangtoolLoader_OEarly(PassManagerBuilder::EP_EarlyAsPossible,
63+
loadNVVMPass);
64+
65+
#if LLVM_VERSION_MAJOR >= 9
66+
67+
static void loadLTOPass(const PassManagerBuilder &Builder,
68+
legacy::PassManagerBase &PM) {
69+
loadPass(Builder, PM);
70+
PassManagerBuilder Builder2 = Builder;
71+
Builder2.Inliner = nullptr;
72+
Builder2.LibraryInfo = nullptr;
73+
Builder2.ExportSummary = nullptr;
74+
Builder2.ImportSummary = nullptr;
75+
/*
76+
Builder2.LoopVectorize = false;
77+
Builder2.SLPVectorize = false;
78+
Builder2.DisableUnrollLoops = true;
79+
Builder2.RerollLoops = true;
80+
*/
81+
const_cast<PassManagerBuilder &>(Builder2).populateModulePassManager(PM);
82+
}
83+
84+
static RegisterStandardPasses
85+
clangtoolLoader_LTO(PassManagerBuilder::EP_FullLinkTimeOptimizationEarly,
86+
loadLTOPass);
87+
#endif

enzyme/cmake/EnzymeConfig.cmake.in

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ set(Enzyme_LLVM_VERSION_PATCH "@CONF_LLVM_VERSION_PATCH@")
88
set(Enzyme_LLVM_DIR "@CONF_LLVM_DIR@")
99
set(Enzyme_LLVM_BINARY_DIR "@CONF_LLVM_BINARY_DIR@")
1010

11-
set(_supported_components LLVMEnzyme ClangEnzyme LLVM)
11+
set(_supported_components LLVMEnzyme ClangEnzyme LLDEnzyme LLVM)
1212

1313
foreach(_comp ${Enzyme_FIND_COMPONENTS})
14-
if (_comp STREQUAL "LLVMEnzyme" OR _comp STREQUAL "ClangEnzyme")
14+
if (_comp STREQUAL "LLVMEnzyme" OR _comp STREQUAL "ClangEnzyme" OR _comp STREQUAL "LLDEnzyme")
1515
# Our library dependencies (contains definitions for IMPORTED targets)
16-
if(NOT TARGET LLVMEnzyme-${Enzyme_LLVM_VERSION_MAJOR} AND NOT TARGET ClangEnzyme-${Enzyme_LLVM_VERSION_MAJOR} AND NOT Enzyme_BINARY_DIR)
16+
if(NOT TARGET LLVMEnzyme-${Enzyme_LLVM_VERSION_MAJOR} AND NOT TARGET ClangEnzyme-${Enzyme_LLVM_VERSION_MAJOR} AND NOT TARGET LLDEnzyme-${Enzyme_LLVM_VERSION_MAJOR} AND NOT Enzyme_BINARY_DIR)
1717
include("${Enzyme_CMAKE_DIR}/EnzymeTargets.cmake")
1818
endif()
1919
# These are IMPORTED targets created by EnzymeTargets.cmake
20-
set(Enzyme_LIBRARIES LLVMEnzyme-${Enzyme_LLVM_VERSION_MAJOR} ClangEnzyme-${Enzyme_LLVM_VERSION_MAJOR})
20+
set(Enzyme_LIBRARIES LLVMEnzyme-${Enzyme_LLVM_VERSION_MAJOR} ClangEnzyme-${Enzyme_LLVM_VERSION_MAJOR} LLDEnzyme-${LLD_LLVM_VERSION_MAJOR})
2121
endif()
22-
endforeach()
22+
endforeach()

0 commit comments

Comments
 (0)