1 *Does not work - not in use*
3 Description: Add LLVM 10 support
5 Remove -std=c++0x, as LLVM 10 requires at least c++14 (the default)
6 Note that this triggers a gcc bug, so build with clang
7 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93299
9 BasicBlockPass no longer exists; as they suggest, replace it with
10 FunctionPass with a loop over BasicBlocks
11 https://github.com/llvm/llvm-project/commit/9f0ff0b2634bab6a5be8dace005c9eb24d386dd1#diff-bddbe5e4c647cb67298584000b67dea1
12 Return true from IntrinsicLoweringPass as it can modify its input
13 (possibly a bug before?)
15 setAlignment now takes a MaybeAlign not a uint
17 Don't call initializeDominatorTreeWrapperPassPass and
18 initializeLoopInfoWrapperPassPass, as they no longer exist
20 Add explicit template initialization to avoid an undefined symbol
23 Pass clang libs as a single string to prevent them being converted
24 to -Wl,-Bstatic -lclang... -Wl,-Bdynamic, as that causes a
25 multiply defined options crash when run
26 (multiple dynamic LLVMs??)
27 builtin_acos_float()clang (LLVM option parsing): for the --pgo-warn-misexpect option: may only occur zero or one times!
30 #--- a/CMake/FindLLVM.cmake
31 #+++ b/CMake/FindLLVM.cmake
32 #@@ -120,11 +120,14 @@ macro(add_one_lib name)
33 # endif (LLVM_SYSTEM_LIBS_ORIG)
34 # endif (LLVM_VERSION_NODOT VERSION_GREATER 34)
36 #+#something harmless because whitespace at start is an error
37 #+set(CLANG_LIBRARIES "-ldl")
38 # macro(add_one_lib name)
39 # FIND_LIBRARY(CLANG_LIB
41 # PATHS ${LLVM_LIBRARY_DIR} NO_DEFAULT_PATH)
42 #- set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_LIB})
43 #+ set(CLANG_LIBRARIES "${CLANG_LIBRARIES} ${CLANG_LIB}")
44 #+ message(STATUS "clanglibs name ${name} this ${CLANG_LIB} all ${CLANG_LIBRARIES} ")
45 # unset(CLANG_LIB CACHE)
50 #@@ -79,7 +78,7 @@ elseif (COMPILER STREQUAL "CLANG")
51 # elseif (COMPILER STREQUAL "ICC")
52 # set (CMAKE_C_CXX_FLAGS "${CMAKE_C_CXX_FLAGS} -wd2928 -Wall -fPIC -fstrict-aliasing -fp-model fast -msse4.1 -Wl,-E")
54 #-set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_CXX_FLAGS} -std=c++0x -Wno-invalid-offsetof")
55 #+set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_CXX_FLAGS} -Wno-invalid-offsetof")
56 # set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_CXX_FLAGS}")
57 # set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DGBE_DEBUG=1")
58 # set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DGBE_DEBUG=1")
59 --- beignet-1.3.2.orig/backend/src/backend/program.cpp
60 +++ beignet-1.3.2/backend/src/backend/program.cpp
61 @@ -695,8 +695,12 @@ namespace gbe {
64 clang::CompilerInvocation::CreateFromArgs(*CI,
65 +#if LLVM_VERSION_MAJOR < 10
67 &args[0] + args.size(),
69 + clang::ArrayRef<const char*>(args),
72 // Create the compiler instance
73 clang::CompilerInstance Clang;
74 @@ -1248,8 +1252,12 @@ EXTEND_QUOTE:
75 // Create the compiler invocation
76 std::unique_ptr<clang::CompilerInvocation> CI(new clang::CompilerInvocation);
77 return clang::CompilerInvocation::CreateFromArgs(*CI,
78 +#if LLVM_VERSION_MAJOR < 10
80 &args[0] + args.size(),
82 + clang::ArrayRef<const char*>(args),
87 --- beignet-1.3.2.orig/backend/src/llvm/llvm_gen_backend.hpp
88 +++ beignet-1.3.2/backend/src/llvm/llvm_gen_backend.hpp
89 @@ -130,10 +130,10 @@ namespace gbe
90 llvm::FunctionPass *createGenPass(ir::Unit &unit);
92 /*! Remove the GEP instructions */
93 - llvm::BasicBlockPass *createRemoveGEPPass(const ir::Unit &unit);
94 + llvm::FunctionPass *createRemoveGEPPass(const ir::Unit &unit);
96 /*! Merge load/store if possible */
97 - llvm::BasicBlockPass *createLoadStoreOptimizationPass();
98 + llvm::FunctionPass *createLoadStoreOptimizationPass();
100 /*! Scalarize all vector op instructions */
101 llvm::FunctionPass* createScalarizePass();
102 @@ -141,7 +141,7 @@ namespace gbe
103 llvm::ModulePass* createBarrierNodupPass(bool);
105 /*! Convert the Intrinsic call to gen function */
106 - llvm::BasicBlockPass *createIntrinsicLoweringPass();
107 + llvm::FunctionPass *createIntrinsicLoweringPass();
109 /*! Passer the printf function call. */
110 llvm::FunctionPass* createPrintfParserPass(ir::Unit &unit);
111 --- beignet-1.3.2.orig/backend/src/llvm/llvm_intrinsic_lowering.cpp
112 +++ beignet-1.3.2/backend/src/llvm/llvm_intrinsic_lowering.cpp
114 using namespace llvm;
117 - class InstrinsicLowering : public BasicBlockPass
118 + class InstrinsicLowering : public FunctionPass
122 InstrinsicLowering() :
123 - BasicBlockPass(ID) {}
124 + FunctionPass(ID) {}
126 void getAnalysisUsage(AnalysisUsage &AU) const {
128 @@ -93,9 +93,9 @@ namespace gbe {
129 CI->eraseFromParent();
132 - virtual bool runOnBasicBlock(BasicBlock &BB)
133 + virtual bool runOnFunction(Function &F)
135 - bool changedBlock = false;
136 + for (BasicBlock &BB : F) {
137 Module *M = BB.getParent()->getParent();
140 @@ -159,13 +159,14 @@ namespace gbe {
144 - return changedBlock;
150 char InstrinsicLowering::ID = 0;
152 - BasicBlockPass *createIntrinsicLoweringPass() {
153 + FunctionPass *createIntrinsicLoweringPass() {
154 return new InstrinsicLowering();
157 --- beignet-1.3.2.orig/backend/src/llvm/llvm_loadstore_optimization.cpp
158 +++ beignet-1.3.2/backend/src/llvm/llvm_loadstore_optimization.cpp
161 using namespace llvm;
163 - class GenLoadStoreOptimization : public BasicBlockPass {
164 + class GenLoadStoreOptimization : public FunctionPass {
169 const DataLayout *TD;
170 - GenLoadStoreOptimization() : BasicBlockPass(ID) {}
171 + GenLoadStoreOptimization() : FunctionPass(ID) {}
173 void getAnalysisUsage(AnalysisUsage &AU) const {
174 #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 38
175 @@ -45,7 +45,9 @@ namespace gbe {
176 AU.setPreservesCFG();
179 - virtual bool runOnBasicBlock(BasicBlock &BB) {
180 + virtual bool runOnFunction(Function &F) {
181 + bool changedAnyBlock = false;
182 + for (BasicBlock &BB : F) {
183 #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 38
184 SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
186 @@ -59,7 +61,9 @@ namespace gbe {
188 TD = getAnalysisIfAvailable<DataLayout>();
190 - return optimizeLoadStore(BB);
191 + changedAnyBlock = optimizeLoadStore(BB) | changedAnyBlock;
193 + return changedAnyBlock;
195 Type *getValueType(Value *insn);
196 Value *getPointerOperand(Value *I);
197 @@ -148,7 +152,11 @@ namespace gbe {
198 values.push_back(merged[i]);
200 LoadInst *ld = cast<LoadInst>(merged[0]);
201 +#if LLVM_VERSION_MAJOR < 10
202 unsigned align = ld->getAlignment();
204 + MaybeAlign align = ld->getAlign();
206 unsigned addrSpace = ld->getPointerAddressSpace();
207 // insert before first load
208 Builder.SetInsertPoint(ld);
209 @@ -231,7 +239,11 @@ namespace gbe {
211 unsigned addrSpace = st->getPointerAddressSpace();
213 +#if LLVM_VERSION_MAJOR < 10
214 unsigned align = st->getAlignment();
216 + MaybeAlign align = st->getAlign();
218 // insert before the last store
219 Builder.SetInsertPoint(merged[size-1]);
221 @@ -325,7 +337,7 @@ namespace gbe {
225 - BasicBlockPass *createLoadStoreOptimizationPass() {
226 + FunctionPass *createLoadStoreOptimizationPass() {
227 return new GenLoadStoreOptimization();
230 --- beignet-1.3.2.orig/backend/src/llvm/llvm_passes.cpp
231 +++ beignet-1.3.2/backend/src/llvm/llvm_passes.cpp
233 #include "sys/map.hpp"
235 using namespace llvm;
237 +template class cfg::Update<BasicBlock *>;
240 bool isKernelFunction(const llvm::Function &F) {
241 @@ -219,13 +219,13 @@ namespace gbe
245 - class GenRemoveGEPPasss : public BasicBlockPass
246 + class GenRemoveGEPPasss : public FunctionPass
251 GenRemoveGEPPasss(const ir::Unit &unit) :
252 - BasicBlockPass(ID),
255 const ir::Unit &unit;
256 void getAnalysisUsage(AnalysisUsage &AU) const {
257 @@ -242,16 +242,18 @@ namespace gbe
259 bool simplifyGEPInstructions(GetElementPtrInst* GEPInst);
261 - virtual bool runOnBasicBlock(BasicBlock &BB)
262 + virtual bool runOnFunction(Function &F)
264 - bool changedBlock = false;
265 + bool changedAnyBlock = false;
266 + for (BasicBlock &BB : F) {
267 iplist<Instruction>::iterator I = BB.getInstList().begin();
268 for (auto nextI = I, E = --BB.getInstList().end(); I != E; I = nextI) {
269 iplist<Instruction>::iterator I = nextI++;
270 if(GetElementPtrInst* gep = dyn_cast<GetElementPtrInst>(&*I))
271 - changedBlock = (simplifyGEPInstructions(gep) || changedBlock);
272 + changedAnyBlock = (simplifyGEPInstructions(gep) | changedAnyBlock);
274 - return changedBlock;
276 + return changedAnyBlock;
280 @@ -367,7 +369,7 @@ namespace gbe
284 - BasicBlockPass *createRemoveGEPPass(const ir::Unit &unit) {
285 + FunctionPass *createRemoveGEPPass(const ir::Unit &unit) {
286 return new GenRemoveGEPPasss(unit);
288 } /* namespace gbe */
289 --- beignet-1.3.2.orig/backend/src/llvm/llvm_sampler_fix.cpp
290 +++ beignet-1.3.2/backend/src/llvm/llvm_sampler_fix.cpp
291 @@ -33,11 +33,13 @@ namespace gbe {
292 class SamplerFix : public FunctionPass {
294 SamplerFix() : FunctionPass(ID) {
295 +#if LLVM_VERSION_MAJOR < 10
296 #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 35
297 initializeDominatorTreeWrapperPassPass(*PassRegistry::getPassRegistry());
299 initializeDominatorTreePass(*PassRegistry::getPassRegistry());
304 bool visitCallInst(CallInst *I) {
305 --- a/backend/src/llvm/llvm_gen_backend.cpp
306 +++ b/backend/src/llvm/llvm_gen_backend.cpp
307 @@ -575,10 +575,12 @@ namespace gbe
311 +#if LLVM_VERSION_MAJOR < 10
312 #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 37
313 initializeLoopInfoWrapperPassPass(*PassRegistry::getPassRegistry());
315 initializeLoopInfoPass(*PassRegistry::getPassRegistry());
318 pass = PASS_EMIT_REGISTERS;
320 --- a/backend/src/llvm/llvm_scalarize.cpp
321 +++ b/backend/src/llvm/llvm_scalarize.cpp
322 @@ -96,10 +96,12 @@ namespace gbe {
324 Scalarize() : FunctionPass(ID)
326 +#if LLVM_VERSION_MAJOR < 10
327 #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 35
328 initializeDominatorTreeWrapperPassPass(*PassRegistry::getPassRegistry());
330 initializeDominatorTreePass(*PassRegistry::getPassRegistry());