Hi, is there anybody who got beignet working with llvm 10 and can she/he share experiences and patches?
Background: I just got the bad news from intel-compute-runtime that they have to postpone the implementation of cl_khr_gl_sharing indefinitely as the implementation seems to be much more involved than thought. As I need this feature, I'm holding back any upgrades of my linux box to keep llvm version 8 (the last version I got beignet working with on my arch system), so I'm sort of in a deadlocked situation. -- Orm Am Samstag, den 18. Januar 2020 um 17:31:06 Uhr (+0000) schrieb Rebecca N. Palmer: > This gets it to build, but *crashes when run* with > builtin_acos_float()clang (LLVM option parsing): for the --pgo-warn-misexpect > option: may only occur zero or one times! > > This vaguely reminds me of multiple-LLVMs bugs like > https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=768185 , > but Debian beignet already links LLVM/clang statically > which has previously avoided those. > > ----- > > Remove -std=c++0x, as LLVM 10 requires at least c++14 (the default) > Note that this triggers a gcc bug, so build with clang > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93299 > > BasicBlockPass no longer exists; as they suggest, replace it with > FunctionPass with a loop over BasicBlocks > https://github.com/llvm/llvm-project/commit/9f0ff0b2634bab6a5be8dace005c9eb24d386dd1#diff-bddbe5e4c647cb67298584000b67dea1 > Return true from IntrinsicLoweringPass as it can modify its input > (possibly a bug before?) > > setAlignment now takes a MaybeAlign not a uint > > Don't call initializeDominatorTreeWrapperPassPass and > initializeLoopInfoWrapperPassPass, as they no longer exist > > Add explicit template initialization to avoid an undefined symbol > > ###does not help### > Pass clang libs as a single string to prevent them being converted > to -Wl,-Bstatic -lclang... -Wl,-Bdynamic, as that causes a > multiply defined options crash when run > (multiple dynamic LLVMs??) > > > --- a/CMake/FindLLVM.cmake > +++ b/CMake/FindLLVM.cmake > @@ -120,11 +120,14 @@ macro(add_one_lib name) > endif (LLVM_SYSTEM_LIBS_ORIG) > endif (LLVM_VERSION_NODOT VERSION_GREATER 34) > > +#something harmless because whitespace at start is an error > +set(CLANG_LIBRARIES "-ldl") > macro(add_one_lib name) > FIND_LIBRARY(CLANG_LIB > NAMES ${name} > PATHS ${LLVM_LIBRARY_DIR} NO_DEFAULT_PATH) > - set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_LIB}) > + set(CLANG_LIBRARIES "${CLANG_LIBRARIES} ${CLANG_LIB}") > + message(STATUS "clanglibs name ${name} this ${CLANG_LIB} all > ${CLANG_LIBRARIES} ") > unset(CLANG_LIB CACHE) > endmacro() > > --- a/CMakeLists.txt > +++ b/CMakeLists.txt > @@ -79,7 +78,7 @@ elseif (COMPILER STREQUAL "CLANG") > elseif (COMPILER STREQUAL "ICC") > set (CMAKE_C_CXX_FLAGS "${CMAKE_C_CXX_FLAGS} -wd2928 -Wall -fPIC > -fstrict-aliasing -fp-model fast -msse4.1 -Wl,-E") > endif () > -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_CXX_FLAGS} -std=c++0x > -Wno-invalid-offsetof") > +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_CXX_FLAGS} > -Wno-invalid-offsetof") > set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_CXX_FLAGS}") > set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DGBE_DEBUG=1") > set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DGBE_DEBUG=1") > --- a/utests/CMakeLists.txt > +++ b/utests/CMakeLists.txt > @@ -26,8 +26,8 @@ if (NOT NOT_BUILD_STAND_ALONE_UTEST) > # Threads > Find_Package(Threads) > > - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_CXX_FLAGS} -std=c++0x > -Wno-invalid-offsetof") > - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_CXX_FLAGS}") > + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_CXX_FLAGS} > -Wno-invalid-offsetof -ffloat-store -fno-strict-aliasing") > + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_CXX_FLAGS} -ffloat-store > -fno-strict-aliasing") #compiler_{degrees,radians,function_argument2} use > equality comparison of floats, compiler_long_bitcast uses aliasing > set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DGBE_DEBUG=1") > set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DGBE_DEBUG=1") > set (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG -DGBE_DEBUG=0") > --- beignet-1.3.2.orig/backend/src/backend/program.cpp > +++ beignet-1.3.2/backend/src/backend/program.cpp > @@ -695,8 +695,12 @@ namespace gbe { > ); > > clang::CompilerInvocation::CreateFromArgs(*CI, > +#if LLVM_VERSION_MAJOR < 10 > &args[0], > &args[0] + args.size(), > +#else > + clang::ArrayRef<const > char*>(args), > +#endif > Diags); > // Create the compiler instance > clang::CompilerInstance Clang; > @@ -1248,8 +1252,12 @@ EXTEND_QUOTE: > // Create the compiler invocation > std::unique_ptr<clang::CompilerInvocation> CI(new > clang::CompilerInvocation); > return clang::CompilerInvocation::CreateFromArgs(*CI, > +#if LLVM_VERSION_MAJOR < 10 > &args[0], > &args[0] + > args.size(), > +#else > + clang::ArrayRef<const > char*>(args), > +#endif > Diags); > } > #endif > --- beignet-1.3.2.orig/backend/src/llvm/llvm_gen_backend.hpp > +++ beignet-1.3.2/backend/src/llvm/llvm_gen_backend.hpp > @@ -130,10 +130,10 @@ namespace gbe > llvm::FunctionPass *createGenPass(ir::Unit &unit); > > /*! Remove the GEP instructions */ > - llvm::BasicBlockPass *createRemoveGEPPass(const ir::Unit &unit); > + llvm::FunctionPass *createRemoveGEPPass(const ir::Unit &unit); > > /*! Merge load/store if possible */ > - llvm::BasicBlockPass *createLoadStoreOptimizationPass(); > + llvm::FunctionPass *createLoadStoreOptimizationPass(); > > /*! Scalarize all vector op instructions */ > llvm::FunctionPass* createScalarizePass(); > @@ -141,7 +141,7 @@ namespace gbe > llvm::ModulePass* createBarrierNodupPass(bool); > > /*! Convert the Intrinsic call to gen function */ > - llvm::BasicBlockPass *createIntrinsicLoweringPass(); > + llvm::FunctionPass *createIntrinsicLoweringPass(); > > /*! Passer the printf function call. */ > llvm::FunctionPass* createPrintfParserPass(ir::Unit &unit); > --- beignet-1.3.2.orig/backend/src/llvm/llvm_intrinsic_lowering.cpp > +++ beignet-1.3.2/backend/src/llvm/llvm_intrinsic_lowering.cpp > @@ -29,12 +29,12 @@ > using namespace llvm; > > namespace gbe { > - class InstrinsicLowering : public BasicBlockPass > + class InstrinsicLowering : public FunctionPass > { > public: > static char ID; > InstrinsicLowering() : > - BasicBlockPass(ID) {} > + FunctionPass(ID) {} > > void getAnalysisUsage(AnalysisUsage &AU) const { > > @@ -93,9 +93,9 @@ namespace gbe { > CI->eraseFromParent(); > return NewCI; > } > - virtual bool runOnBasicBlock(BasicBlock &BB) > + virtual bool runOnFunction(Function &F) > { > - bool changedBlock = false; > + for (BasicBlock &BB : F) { > Module *M = BB.getParent()->getParent(); > > DataLayout TD(M); > @@ -159,13 +159,14 @@ namespace gbe { > } > } > } > - return changedBlock; > + } > + return true; > } > }; > > char InstrinsicLowering::ID = 0; > > - BasicBlockPass *createIntrinsicLoweringPass() { > + FunctionPass *createIntrinsicLoweringPass() { > return new InstrinsicLowering(); > } > } // end namespace > --- beignet-1.3.2.orig/backend/src/llvm/llvm_loadstore_optimization.cpp > +++ beignet-1.3.2/backend/src/llvm/llvm_loadstore_optimization.cpp > @@ -26,13 +26,13 @@ > > using namespace llvm; > namespace gbe { > - class GenLoadStoreOptimization : public BasicBlockPass { > + class GenLoadStoreOptimization : public FunctionPass { > > public: > static char ID; > ScalarEvolution *SE; > const DataLayout *TD; > - GenLoadStoreOptimization() : BasicBlockPass(ID) {} > + GenLoadStoreOptimization() : FunctionPass(ID) {} > > void getAnalysisUsage(AnalysisUsage &AU) const { > #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 38 > @@ -45,7 +45,9 @@ namespace gbe { > AU.setPreservesCFG(); > } > > - virtual bool runOnBasicBlock(BasicBlock &BB) { > + virtual bool runOnFunction(Function &F) { > + bool changedAnyBlock = false; > + for (BasicBlock &BB : F) { > #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 38 > SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE(); > #else > @@ -59,7 +61,9 @@ namespace gbe { > #else > TD = getAnalysisIfAvailable<DataLayout>(); > #endif > - return optimizeLoadStore(BB); > + changedAnyBlock = optimizeLoadStore(BB) | changedAnyBlock; > + } > + return changedAnyBlock; > } > Type *getValueType(Value *insn); > Value *getPointerOperand(Value *I); > @@ -148,7 +152,11 @@ namespace gbe { > values.push_back(merged[i]); > } > LoadInst *ld = cast<LoadInst>(merged[0]); > +#if LLVM_VERSION_MAJOR < 10 > unsigned align = ld->getAlignment(); > +#else > + MaybeAlign align = ld->getAlign(); > +#endif > unsigned addrSpace = ld->getPointerAddressSpace(); > // insert before first load > Builder.SetInsertPoint(ld); > @@ -231,7 +239,11 @@ namespace gbe { > > unsigned addrSpace = st->getPointerAddressSpace(); > > +#if LLVM_VERSION_MAJOR < 10 > unsigned align = st->getAlignment(); > +#else > + MaybeAlign align = st->getAlign(); > +#endif > // insert before the last store > Builder.SetInsertPoint(merged[size-1]); > > @@ -325,7 +337,7 @@ namespace gbe { > return changed; > } > > - BasicBlockPass *createLoadStoreOptimizationPass() { > + FunctionPass *createLoadStoreOptimizationPass() { > return new GenLoadStoreOptimization(); > } > }; > --- beignet-1.3.2.orig/backend/src/llvm/llvm_passes.cpp > +++ beignet-1.3.2/backend/src/llvm/llvm_passes.cpp > @@ -37,7 +37,7 @@ > #include "sys/map.hpp" > > using namespace llvm; > - > +template class cfg::Update<BasicBlock *>; > namespace gbe > { > bool isKernelFunction(const llvm::Function &F) { > @@ -219,13 +219,13 @@ namespace gbe > return offset; > } > > - class GenRemoveGEPPasss : public BasicBlockPass > + class GenRemoveGEPPasss : public FunctionPass > { > > public: > static char ID; > GenRemoveGEPPasss(const ir::Unit &unit) : > - BasicBlockPass(ID), > + FunctionPass(ID), > unit(unit) {} > const ir::Unit &unit; > void getAnalysisUsage(AnalysisUsage &AU) const { > @@ -242,16 +242,18 @@ namespace gbe > > bool simplifyGEPInstructions(GetElementPtrInst* GEPInst); > > - virtual bool runOnBasicBlock(BasicBlock &BB) > + virtual bool runOnFunction(Function &F) > { > - bool changedBlock = false; > + bool changedAnyBlock = false; > + for (BasicBlock &BB : F) { > iplist<Instruction>::iterator I = BB.getInstList().begin(); > for (auto nextI = I, E = --BB.getInstList().end(); I != E; I = nextI) { > iplist<Instruction>::iterator I = nextI++; > if(GetElementPtrInst* gep = dyn_cast<GetElementPtrInst>(&*I)) > - changedBlock = (simplifyGEPInstructions(gep) || changedBlock); > + changedAnyBlock = (simplifyGEPInstructions(gep) | changedAnyBlock); > } > - return changedBlock; > + } > + return changedAnyBlock; > } > }; > > @@ -367,7 +369,7 @@ namespace gbe > return true; > } > > - BasicBlockPass *createRemoveGEPPass(const ir::Unit &unit) { > + FunctionPass *createRemoveGEPPass(const ir::Unit &unit) { > return new GenRemoveGEPPasss(unit); > } > } /* namespace gbe */ > --- beignet-1.3.2.orig/backend/src/llvm/llvm_sampler_fix.cpp > +++ beignet-1.3.2/backend/src/llvm/llvm_sampler_fix.cpp > @@ -33,11 +33,13 @@ namespace gbe { > class SamplerFix : public FunctionPass { > public: > SamplerFix() : FunctionPass(ID) { > +#if LLVM_VERSION_MAJOR < 10 > #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 35 > > initializeDominatorTreeWrapperPassPass(*PassRegistry::getPassRegistry()); > #else > initializeDominatorTreePass(*PassRegistry::getPassRegistry()); > #endif > +#endif > } > > bool visitCallInst(CallInst *I) { > --- a/backend/src/llvm/llvm_gen_backend.cpp > +++ b/backend/src/llvm/llvm_gen_backend.cpp > @@ -575,10 +575,12 @@ namespace gbe > has_errors(false), > legacyMode(true) > { > +#if LLVM_VERSION_MAJOR < 10 > #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 37 > initializeLoopInfoWrapperPassPass(*PassRegistry::getPassRegistry()); > #else > initializeLoopInfoPass(*PassRegistry::getPassRegistry()); > +#endif > #endif > pass = PASS_EMIT_REGISTERS; > } > --- a/backend/src/llvm/llvm_scalarize.cpp > +++ b/backend/src/llvm/llvm_scalarize.cpp > @@ -96,10 +96,12 @@ namespace gbe { > > Scalarize() : FunctionPass(ID) > { > +#if LLVM_VERSION_MAJOR < 10 > #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 35 > > initializeDominatorTreeWrapperPassPass(*PassRegistry::getPassRegistry()); > #else > initializeDominatorTreePass(*PassRegistry::getPassRegistry()); > +#endif > #endif > } > > > _______________________________________________ > Beignet mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/beignet
