[Beignet] Attempt at LLVM 10 support (currently broken)

Orm Finnendahl orm.finnendahl at selma.hfmdk-frankfurt.de
Mon Sep 14 13:11:33 UTC 2020


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
> Beignet at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list