summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO46
-rw-r--r--GBE-let-GenRegister-reg-never-return-uninitialized-m.patch37
-rw-r--r--PKGBUILD116
-rw-r--r--llvm10.patch358
-rw-r--r--llvm8.patch71
-rw-r--r--llvm9.patch113
-rw-r--r--utests_add_limits.patch11
7 files changed, 703 insertions, 49 deletions
diff --git a/.SRCINFO b/.SRCINFO
index bdc09ff85867..64742a979118 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,33 +1,35 @@
pkgbase = beignet-git
- pkgdesc = A GPGPU System for Intel Ivybridge GPUs
- pkgver = Release_v1.0.0.r676.gad86ed3
+ pkgdesc = An open source OpenCL implementation for Intel IvyBridge & Haswell iGPUs
+ pkgver = 1.0.0.r1396.gf72309a5
pkgrel = 2
- url = http://cgit.freedesktop.org/beignet/
+ url = https://01.org/beignet
arch = x86_64
- license = LGPL2.1
- makedepends = clang
+ license = LGPL
+ makedepends = git
+ makedepends = llvm70
makedepends = cmake
- makedepends = python2
+ makedepends = ninja
+ makedepends = python
+ makedepends = ocl-icd
depends = glu
- depends = libsm
- depends = libxext
+ depends = clang70
depends = mesa
- depends = ncurses
- depends = ocl-icd
- depends = llvm
+ depends = opencl-headers
+ provides = beignet
provides = opencl-intel
- provides = opencl-headers
- provides = opencl-headers12
+ provides = opencl-driver
conflicts = beignet
- conflicts = opencl-intel
- conflicts = opencl-headers
- conflicts = opencl-headers12
- replaces = beignet
- replaces = opencl-intel
- replaces = opencl-headers
- replaces = opencl-headers12
- source = git://anongit.freedesktop.org/beignet
+ source = git+https://github.com/intel/beignet.git
+ source = GBE-let-GenRegister-reg-never-return-uninitialized-m.patch
+ source = utests_add_limits.patch
+ source = llvm8.patch
+ source = llvm9.patch
+ source = llvm10.patch
sha256sums = SKIP
+ sha256sums = c1f5880bb192103c371d51f57f646837ca01a8bbe012b9022d4e345c2f1187de
+ sha256sums = 584dd293856ddfc76ca9e50488aa2076239ab568a945e957ca3221e2d30b1c52
+ sha256sums = d24e4d8a1a791dc02c91117f900143789dd6f01eaa89292ad67c4fb4eaf84328
+ sha256sums = 5913a93fe6ef77b91480bb6d27c7875673294c0a8a924b2ac66756d0d3577908
+ sha256sums = 2eb9b0801e24f4e537033b41a6bc462e4082f6216d62933240ca3010020ea779
pkgname = beignet-git
-
diff --git a/GBE-let-GenRegister-reg-never-return-uninitialized-m.patch b/GBE-let-GenRegister-reg-never-return-uninitialized-m.patch
new file mode 100644
index 000000000000..7f6efa7d14b1
--- /dev/null
+++ b/GBE-let-GenRegister-reg-never-return-uninitialized-m.patch
@@ -0,0 +1,37 @@
+From e837f9f4c6133d8ef56923ffbdbca224b1d7aa23 Mon Sep 17 00:00:00 2001
+From: Michael Lass <bevan@bi-co.net>
+Date: Sun, 1 Dec 2019 13:05:45 +0100
+Subject: [PATCH] GBE: let GenRegister::reg() never return uninitialized memory
+
+GenRegister::reg() is called throughout the code, not only on virtual
+but also on physical registers. For the latter, value.reg is not
+initialized and therefore reg() returns uninitialized memory, leading to
+undefined behavior. Make sure to always return initialized memory by
+returning a valid ir::Register, even for physical registers.
+
+Fixes https://gitlab.freedesktop.org/beignet/beignet/issues/12
+---
+ backend/src/backend/gen_register.hpp | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/backend/src/backend/gen_register.hpp b/backend/src/backend/gen_register.hpp
+index 6c73f5e6..78846c91 100644
+--- a/backend/src/backend/gen_register.hpp
++++ b/backend/src/backend/gen_register.hpp
+@@ -243,7 +243,12 @@ namespace gbe
+ }
+
+ /*! Return the IR virtual register */
+- INLINE ir::Register reg(void) const { return ir::Register(value.reg); }
++ INLINE ir::Register reg(void) const {
++ if (this->physical)
++ return ir::Register();
++ else
++ return ir::Register(value.reg);
++ }
+
+ /*! For immediates or virtual register */
+ union {
+--
+2.24.0
+
diff --git a/PKGBUILD b/PKGBUILD
index 75e2e93fe5e5..06a4104609bf 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,37 +1,99 @@
-# Current Maintainer: Sean Lynch <seanl@literati.org>
+# Maintainer: Michael Lass <bevan@bi-co.net>
+# Contributor: Sean Lynch <seanl@literati.org>
+# Contributor: Bruno Pagani <archange@archlinux.org>
+# Contributor: Antoine Lubineau <antoine@lubignon.info>
+# Contributor: Leopold Bloom <blinxwang@gmail.com>
+# Contributor: Michal Krenek (a.k.a. Mikos) <m.krenek@gmail.com>
+
+# This PKGBUILD is maintained on github:
+# https://github.com/michaellass/AUR
+
+# For me, utests fail when built with Clang 10. I therefore by default stick to
+# Clang 7 for which no unofficial patches are required. Patches to build against
+# Clang 8, 9 or 10 are however included and can be simply commented in.
+# - Michael
+
pkgname=beignet-git
-pkgver=1.0.0.r799.gcf95b44
-pkgrel=1
-pkgdesc='A GPGPU System for Intel Ivybridge GPUs'
-arch=('x86_64')
-url='http://cgit.freedesktop.org/beignet/'
-license=('LGPL2.1')
-depends=('glu' 'libsm' 'libxext' 'mesa' 'ncurses' 'ocl-icd' 'llvm')
-makedepends=('clang' 'cmake' 'python2')
-provides=('opencl-intel' 'opencl-headers' 'opencl-headers12')
-conflicts=('beignet' 'opencl-intel' 'opencl-headers' 'opencl-headers12')
-replaces=('beignet' 'opencl-intel' 'opencl-headers' 'opencl-headers12')
-source=("git://anongit.freedesktop.org/beignet")
-sha256sums=('SKIP')
+pkgver=1.0.0.r1396.gf72309a5
+pkgrel=2
+pkgdesc="An open source OpenCL implementation for Intel IvyBridge & Haswell iGPUs"
+arch=(x86_64)
+url="https://01.org/beignet"
+license=(LGPL)
+depends=(glu clang70 mesa opencl-headers)
+makedepends=(git llvm70 cmake ninja python ocl-icd)
+provides=(beignet opencl-intel opencl-driver)
+conflicts=(beignet)
+source=("git+https://github.com/intel/beignet.git"
+ GBE-let-GenRegister-reg-never-return-uninitialized-m.patch
+ utests_add_limits.patch
+ llvm8.patch
+ llvm9.patch
+ llvm10.patch)
+sha256sums=('SKIP'
+ 'c1f5880bb192103c371d51f57f646837ca01a8bbe012b9022d4e345c2f1187de'
+ '584dd293856ddfc76ca9e50488aa2076239ab568a945e957ca3221e2d30b1c52'
+ 'd24e4d8a1a791dc02c91117f900143789dd6f01eaa89292ad67c4fb4eaf84328'
+ '5913a93fe6ef77b91480bb6d27c7875673294c0a8a924b2ac66756d0d3577908'
+ '2eb9b0801e24f4e537033b41a6bc462e4082f6216d62933240ca3010020ea779')
function pkgver() {
- cd "$srcdir/beignet"
- git describe --long --tags | sed 's/^Release_v//;s/-/.r/;s/-/./'
+ cd "$srcdir/beignet"
+ git describe --long --tags | sed 's/^Release_v//;s/-/.r/;s/-/./'
+}
+
+prepare() {
+ cd beignet
+
+ # Remove implementation of cl_intel_device_side_avc_motion_estimation
+ # (conflicts with the implemention in Clang 8)
+ # git revert -n 9b7ca443cf7b d61933205874 a4257c7475e7 5a288032ab23 9cb7ff4c285d
+
+ # Static linking leads to build failure due to the gbe compiler still using shared libs
+ git revert -n 1bd0d252d733
+
+ # Fix undefined behavior
+ # See:
+ # * https://github.com/intel/beignet/pull/16
+ # * https://gitlab.freedesktop.org/beignet/beignet/issues/12
+ # A similar fix is included in llvm8.patch
+ patch -Np1 -i ../GBE-let-GenRegister-reg-never-return-uninitialized-m.patch
+
+ # Patches from FreeBSD + Debian to build with newer LLVM
+ # patch -Np1 -i ../llvm8.patch
+ # patch -Np1 -i ../llvm9.patch
+
+ # https://lists.freedesktop.org/archives/beignet/2020-January/009251.html
+ # https://github.com/intel/opencl-clang/commit/77ae1114c7bf79d724f5129461
+ # patch -Np1 -i ../llvm10.patch
+
+ # Add missing <limits> include to utest header (required by some utests)
+ patch -p1 -i ../utests_add_limits.patch
}
build() {
- cd "$srcdir/beignet"
- mkdir -p "$srcdir/beignet/build"
- cd "$srcdir/beignet/build"
- cmake .. \
- -DCMAKE_INSTALL_PREFIX=/usr \
- -DCMAKE_INSTALL_LIBDIR=/usr/lib \
- -DCMAKE_BUILD_TYPE=RELEASE \
- -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/python2
- make
+ cmake -B build -S beignet -G Ninja \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_LIBDIR=/usr/lib \
+ -DCMAKE_BUILD_TYPE=RELEASE \
+ -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE \
+ -DLLVM_INSTALL_DIR=/opt/llvm70/bin
+ ninja -C build
}
+# runtime_climage_from_boname fails on wayland because there is no DRI2 in xwayland
+#check() {
+# ninja -C build utest_run
+# (
+# source build/utests/setenv.sh
+# build/utests/utest_run
+# )
+#}
+
package() {
- cd "$srcdir/beignet/build"
- make DESTDIR="$pkgdir/" install
+ DESTDIR="${pkgdir}" ninja -C build install
+ # Remove headers already provided by 'opencl-headers'
+ cd "${pkgdir}"/usr/include/CL
+ rm cl.h cl_d3d10.h cl_d3d11.h cl_dx9_media_sharing.h cl_egl.h cl_ext.h \
+ cl_gl.h cl_gl_ext.h cl_platform.h opencl.h
}
diff --git a/llvm10.patch b/llvm10.patch
new file mode 100644
index 000000000000..93683bbd2159
--- /dev/null
+++ b/llvm10.patch
@@ -0,0 +1,358 @@
+diff -upr beignet.orig/backend/src/backend/program.cpp beignet/backend/src/backend/program.cpp
+--- beignet.orig/backend/src/backend/program.cpp 2020-04-16 03:44:21.153955099 +0300
++++ beignet/backend/src/backend/program.cpp 2020-04-16 03:47:50.369205839 +0300
+@@ -694,9 +694,14 @@ namespace gbe {
+ #endif
+ );
+
++ llvm::cl::ResetAllOptionOccurrences();
+ 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;
+@@ -1242,8 +1247,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
+Only in beignet/backend/src/backend: program.cpp.orig
+Only in beignet.orig/backend/src: CMakeLists.txt.orig
+diff -upr beignet.orig/backend/src/llvm/llvm_gen_backend.cpp beignet/backend/src/llvm/llvm_gen_backend.cpp
+--- beignet.orig/backend/src/llvm/llvm_gen_backend.cpp 2020-04-16 03:44:21.783970632 +0300
++++ beignet/backend/src/llvm/llvm_gen_backend.cpp 2020-04-16 03:45:04.141685867 +0300
+@@ -575,11 +575,13 @@ 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;
+ }
+
+diff -upr beignet.orig/backend/src/llvm/llvm_gen_backend.hpp beignet/backend/src/llvm/llvm_gen_backend.hpp
+--- beignet.orig/backend/src/llvm/llvm_gen_backend.hpp 2020-04-16 03:44:21.177289008 +0300
++++ beignet/backend/src/llvm/llvm_gen_backend.hpp 2020-04-16 03:45:04.135019035 +0300
+@@ -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);
+diff -upr beignet.orig/backend/src/llvm/llvm_intrinsic_lowering.cpp beignet/backend/src/llvm/llvm_intrinsic_lowering.cpp
+--- beignet.orig/backend/src/llvm/llvm_intrinsic_lowering.cpp 2020-04-16 03:44:21.783970632 +0300
++++ beignet/backend/src/llvm/llvm_intrinsic_lowering.cpp 2020-04-16 03:45:04.135019035 +0300
+@@ -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
+diff -upr beignet.orig/backend/src/llvm/llvm_loadstore_optimization.cpp beignet/backend/src/llvm/llvm_loadstore_optimization.cpp
+--- beignet.orig/backend/src/llvm/llvm_loadstore_optimization.cpp 2020-04-16 03:44:21.177289008 +0300
++++ beignet/backend/src/llvm/llvm_loadstore_optimization.cpp 2020-04-16 03:45:38.645879307 +0300
+@@ -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);
+@@ -159,7 +163,11 @@ namespace gbe {
+ values.push_back(merged[i]);
+ }
+ LoadInst *ld = cast<LoadInst>(first);
++#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);
+@@ -352,7 +360,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(last);
+
+@@ -466,7 +478,7 @@ namespace gbe {
+ return changed;
+ }
+
+- BasicBlockPass *createLoadStoreOptimizationPass() {
++ FunctionPass *createLoadStoreOptimizationPass() {
+ return new GenLoadStoreOptimization();
+ }
+ };
+Only in beignet/backend/src/llvm: llvm_loadstore_optimization.cpp.orig
+Only in beignet/backend/src/llvm: llvm_loadstore_optimization.cpp.rej
+diff -upr beignet.orig/backend/src/llvm/llvm_passes.cpp beignet/backend/src/llvm/llvm_passes.cpp
+--- beignet.orig/backend/src/llvm/llvm_passes.cpp 2020-04-16 03:44:21.177289008 +0300
++++ beignet/backend/src/llvm/llvm_passes.cpp 2020-04-16 03:45:04.135019035 +0300
+@@ -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 */
+diff -upr beignet.orig/backend/src/llvm/llvm_sampler_fix.cpp beignet/backend/src/llvm/llvm_sampler_fix.cpp
+--- beignet.orig/backend/src/llvm/llvm_sampler_fix.cpp 2020-04-16 03:44:21.783970632 +0300
++++ beignet/backend/src/llvm/llvm_sampler_fix.cpp 2020-04-16 03:45:04.138352451 +0300
+@@ -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) {
+diff -upr beignet.orig/backend/src/llvm/llvm_scalarize.cpp beignet/backend/src/llvm/llvm_scalarize.cpp
+--- beignet.orig/backend/src/llvm/llvm_scalarize.cpp 2020-04-16 03:44:21.670634504 +0300
++++ beignet/backend/src/llvm/llvm_scalarize.cpp 2020-04-16 03:45:04.141685867 +0300
+@@ -96,11 +96,13 @@ 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
+ }
+
+ virtual bool runOnFunction(Function&);
+diff -upr beignet.orig/CMake/FindLLVM.cmake beignet/CMake/FindLLVM.cmake
+--- beignet.orig/CMake/FindLLVM.cmake 2020-04-16 03:44:21.137288022 +0300
++++ beignet/CMake/FindLLVM.cmake 2020-04-16 03:46:38.104039602 +0300
+@@ -104,30 +104,16 @@ string(REGEX REPLACE " *\n" "" LLVM_SYST
+ 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()
+
+ #Assume clang lib path same as llvm lib path
+-add_one_lib("clangCodeGen")
+-add_one_lib("clangFrontend")
+-add_one_lib("clangSerialization")
+-add_one_lib("clangDriver")
+-add_one_lib("clangSema")
+-add_one_lib("clangStaticAnalyzerFrontend")
+-add_one_lib("clangStaticAnalyzerCheckers")
+-add_one_lib("clangStaticAnalyzerCore")
+-add_one_lib("clangAnalysis")
+-add_one_lib("clangEdit")
+-if (LLVM_VERSION_NODOT VERSION_GREATER 80)
+-add_one_lib("clangASTMatchers")
+-endif (LLVM_VERSION_NODOT VERSION_GREATER 80)
+-add_one_lib("clangAST")
+-add_one_lib("clangParse")
+-add_one_lib("clangSema")
+-add_one_lib("clangLex")
+-add_one_lib("clangBasic")
++add_one_lib("clang-cpp")
+Only in beignet/CMake: FindLLVM.cmake.orig
+diff -upr beignet.orig/CMakeLists.txt beignet/CMakeLists.txt
+--- beignet.orig/CMakeLists.txt 2020-04-16 03:44:21.137288022 +0300
++++ beignet/CMakeLists.txt 2020-04-16 03:45:04.131685618 +0300
+@@ -80,7 +80,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")
+diff -upr beignet.orig/utests/CMakeLists.txt beignet/utests/CMakeLists.txt
+--- beignet.orig/utests/CMakeLists.txt 2020-04-16 03:44:21.220623410 +0300
++++ beignet/utests/CMakeLists.txt 2020-04-16 03:45:04.131685618 +0300
+@@ -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")
diff --git a/llvm8.patch b/llvm8.patch
new file mode 100644
index 000000000000..b17a18035d83
--- /dev/null
+++ b/llvm8.patch
@@ -0,0 +1,71 @@
+Description: Fix build with LLVM/Clang 8
+
+Origin: (partly) FreeBSD https://svnweb.freebsd.org/ports/head/lang/beignet/files/patch-llvm8?view=markup
+Author: Jan Beich, Rebecca N. Palmer
+
+--- a/backend/src/CMakeLists.txt
++++ b/backend/src/CMakeLists.txt
+@@ -168,6 +168,7 @@ add_dependencies(gbe beignet_bitcode)
+ endif (NOT (USE_STANDALONE_GBE_COMPILER STREQUAL "true"))
+
+ add_library(gbeinterp SHARED gbe_bin_interpreter.cpp)
++target_link_libraries(gbeinterp ${LLVM_MODULE_LIBS} ${LLVM_SYSTEM_LIBS})
+
+ if (LLVM_VERSION_NODOT VERSION_EQUAL 34)
+ find_library(TERMINFO NAMES tinfo ncurses)
+--- a/backend/src/llvm/llvm_gen_backend.cpp
++++ b/backend/src/llvm/llvm_gen_backend.cpp
+@@ -3073,14 +3073,22 @@ namespace gbe
+
+
+ static unsigned getChildNo(BasicBlock *bb) {
++#if LLVM_VERSION_MAJOR < 8
+ TerminatorInst *term = bb->getTerminator();
++#else
++ Instruction *term = bb->getTerminator();
++#endif
+ return term->getNumSuccessors();
+ }
+
+ // return NULL if index out-range of children number
+ static BasicBlock *getChildPossible(BasicBlock *bb, unsigned index) {
+
++#if LLVM_VERSION_MAJOR < 8
+ TerminatorInst *term = bb->getTerminator();
++#else
++ Instruction *term = bb->getTerminator();
++#endif
+ unsigned childNo = term->getNumSuccessors();
+ BasicBlock *child = NULL;
+ if(index < childNo) {
+--- a/backend/src/backend/gen_register.hpp
++++ b/backend/src/backend/gen_register.hpp
+@@ -225,6 +225,7 @@ namespace gbe
+ uint32_t width,
+ uint32_t hstride)
+ {
++ this->value.reg = 0;//avoid subgroup crash
+ this->type = type;
+ this->file = file;
+ this->nr = nr;
+--- a/backend/src/libocl/tmpl/ocl_integer.tmpl.cl
++++ b/backend/src/libocl/tmpl/ocl_integer.tmpl.cl
+@@ -216,13 +216,14 @@ OVERLOADABLE ulong mad_sat(ulong a, ulon
+ return __gen_ocl_mad_sat(a, b, c);
+ }
+
+-OVERLOADABLE uchar __rotate_left(uchar x, uchar y) { return (x << y) | (x >> (8 - y)); }
++// the 'volatile' is to make the LLVM optimizer leave these alone, as it would convert them to intrinsics (fshl/fshr) that we don't implement
++OVERLOADABLE uchar __rotate_left(uchar x, uchar y) { volatile uchar z; z = (x << y); return z | (x >> (8 - y)); }
+ OVERLOADABLE char __rotate_left(char x, char y) { return __rotate_left((uchar)x, (uchar)y); }
+-OVERLOADABLE ushort __rotate_left(ushort x, ushort y) { return (x << y) | (x >> (16 - y)); }
++OVERLOADABLE ushort __rotate_left(ushort x, ushort y) { volatile ushort z; z = (x << y); return z | (x >> (16 - y)); }
+ OVERLOADABLE short __rotate_left(short x, short y) { return __rotate_left((ushort)x, (ushort)y); }
+-OVERLOADABLE uint __rotate_left(uint x, uint y) { return (x << y) | (x >> (32 - y)); }
++OVERLOADABLE uint __rotate_left(uint x, uint y) { volatile uint z; z = (x << y); return z | (x >> (32 - y)); }
+ OVERLOADABLE int __rotate_left(int x, int y) { return __rotate_left((uint)x, (uint)y); }
+-OVERLOADABLE ulong __rotate_left(ulong x, ulong y) { return (x << y) | (x >> (64 - y)); }
++OVERLOADABLE ulong __rotate_left(ulong x, ulong y) { volatile ulong z; z = (x << y); return z | (x >> (64 - y)); }
+ OVERLOADABLE long __rotate_left(long x, long y) { return __rotate_left((ulong)x, (ulong)y); }
+ #define DEF(type, m) OVERLOADABLE type rotate(type x, type y) { return __rotate_left(x, (type)(y & m)); }
+ DEF(char, 7)
diff --git a/llvm9.patch b/llvm9.patch
new file mode 100644
index 000000000000..5bcb516d5a41
--- /dev/null
+++ b/llvm9.patch
@@ -0,0 +1,113 @@
+Description: Fix build with LLVM/Clang 9
+
+Origin: (mostly) FreeBSD https://svnweb.freebsd.org/ports/head/lang/beignet/files/patch-llvm9?view=markup
+Author: Jan Beich, Rebecca N. Palmer
+
+--- a/CMake/FindLLVM.cmake
++++ b/CMake/FindLLVM.cmake
+@@ -126,6 +126,9 @@ macro(add_one_lib name)
+ add_one_lib("clangStaticAnalyzerCore")
+ add_one_lib("clangAnalysis")
+ add_one_lib("clangEdit")
++if (LLVM_VERSION_NODOT VERSION_GREATER 80)
++add_one_lib("clangASTMatchers")
++endif (LLVM_VERSION_NODOT VERSION_GREATER 80)
+ add_one_lib("clangAST")
+ add_one_lib("clangParse")
+ add_one_lib("clangSema")
+--- a/backend/src/llvm/llvm_intrinsic_lowering.cpp
++++ b/backend/src/llvm/llvm_intrinsic_lowering.cpp
+@@ -77,7 +77,11 @@ namespace gbe {
+ std::vector<Type *> ParamTys;
+ for (Value** I = ArgBegin; I != ArgEnd; ++I)
+ ParamTys.push_back((*I)->getType());
++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90
++ FunctionCallee FCache = M->getOrInsertFunction(NewFn,
++#else
+ Constant* FCache = M->getOrInsertFunction(NewFn,
++#endif
+ FunctionType::get(RetTy, ParamTys, false));
+
+ IRBuilder<> Builder(CI->getParent(), BasicBlock::iterator(CI));
+--- a/backend/src/llvm/llvm_sampler_fix.cpp
++++ b/backend/src/llvm/llvm_sampler_fix.cpp
+@@ -82,7 +82,11 @@ namespace gbe {
+ #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 40
+ Module *M = I->getParent()->getParent()->getParent();
+ #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 50
++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90
++ FunctionCallee samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType());
++#else
+ Value* samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType());
++#endif
+ #else
+ Value* samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType(), nullptr);
+ #endif
+@@ -124,7 +128,11 @@ namespace gbe {
+ #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 40
+ Module *M = I->getParent()->getParent()->getParent();
+ #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 50
++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90
++ FunctionCallee samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType());
++#else
+ Value* samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType());
++#endif
+ #else
+ Value* samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType(), nullptr);
+ #endif
+--- a/backend/src/llvm/llvm_profiling.cpp
++++ b/backend/src/llvm/llvm_profiling.cpp
+@@ -163,10 +163,18 @@ namespace gbe
+ // __gen_ocl_store_timestamp(int nth, int type);
+ Value *Args[2] = {ConstantInt::get(intTy, pointNum++), ConstantInt::get(intTy, profilingType)};
+ #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 50
++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90
++ builder->CreateCall(module->getOrInsertFunction(
++#else
+ builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
++#endif
+ "__gen_ocl_calc_timestamp", Type::getVoidTy(module->getContext()),
+ IntegerType::getInt32Ty(module->getContext()),
++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90
++ IntegerType::getInt32Ty(module->getContext())),
++#else
+ IntegerType::getInt32Ty(module->getContext()))),
++#endif
+ ArrayRef<Value*>(Args));
+ #else
+ builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
+@@ -185,10 +193,18 @@ namespace gbe
+ Value *Args2[2] = {profilingBuf, ConstantInt::get(intTy, profilingType)};
+
+ #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 50
++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90
++ builder->CreateCall(module->getOrInsertFunction(
++#else
+ builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
++#endif
+ "__gen_ocl_store_profiling", Type::getVoidTy(module->getContext()),
+ ptrTy,
++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90
++ IntegerType::getInt32Ty(module->getContext())),
++#else
+ IntegerType::getInt32Ty(module->getContext()))),
++#endif
+ ArrayRef<Value*>(Args2));
+ #else
+ builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction(
+--- a/backend/src/llvm/llvm_device_enqueue.cpp
++++ b/backend/src/llvm/llvm_device_enqueue.cpp
+@@ -398,8 +398,13 @@ namespace gbe {
+ std::vector<Type *> ParamTys;
+ for (Value** iter = args.begin(); iter != args.end(); ++iter)
+ ParamTys.push_back((*iter)->getType());
++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90
++ CallInst* newCI = builder.CreateCall(mod->getOrInsertFunction(
++ "__gen_enqueue_kernel_slm", FunctionType::get(intTy, ParamTys, false)), args);
++#else
+ CallInst* newCI = builder.CreateCall(cast<llvm::Function>(mod->getOrInsertFunction(
+ "__gen_enqueue_kernel_slm", FunctionType::get(intTy, ParamTys, false))), args);
++#endif
+ CI->replaceAllUsesWith(newCI);
+ deadInsnSet.insert(CI);
+ }
diff --git a/utests_add_limits.patch b/utests_add_limits.patch
new file mode 100644
index 000000000000..14d3d64b4f12
--- /dev/null
+++ b/utests_add_limits.patch
@@ -0,0 +1,11 @@
+diff -ru beignet.old/utests/utest_helper.hpp beignet.new/utests/utest_helper.hpp
+--- beignet.old/utests/utest_helper.hpp 2023-03-10 16:35:05.068061790 +0100
++++ beignet.new/utests/utest_helper.hpp 2023-03-10 16:35:46.962204258 +0100
+@@ -34,6 +34,7 @@
+ #include <cassert>
+ #include <cstdio>
+ #include <cstdlib>
++#include <limits>
+
+ #if defined(__ANDROID__)
+ #define __thread