1 |
commit: 2517438cae9831332178378078fc273cb8ffb466 |
2 |
Author: Marek Szuba <marecki <AT> gentoo <DOT> org> |
3 |
AuthorDate: Fri Aug 31 13:27:16 2018 +0000 |
4 |
Commit: Marek Szuba <marecki <AT> gentoo <DOT> org> |
5 |
CommitDate: Fri Aug 31 13:27:16 2018 +0000 |
6 |
URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=2517438c |
7 |
|
8 |
dev-libs/beignet: disable optimisations broken on some platforms |
9 |
|
10 |
Certain optimisation introduced in 1.3.2 is now known not to work |
11 |
correctly on Skylake and Haswell systems. Upstream has been notified but |
12 |
has yet to respond. |
13 |
|
14 |
Upstream-Bug: https://bugs.freedesktop.org/show_bug.cgi?id=102137 |
15 |
Closes: https://bugs.gentoo.org/662760 |
16 |
Package-Manager: Portage-2.3.40, Repoman-2.3.9 |
17 |
|
18 |
dev-libs/beignet/beignet-1.3.2-r2.ebuild | 107 +++++++++++++++++++++ |
19 |
...eignet-1.3.2_disable-doNegAddOptimization.patch | 66 +++++++++++++ |
20 |
2 files changed, 173 insertions(+) |
21 |
|
22 |
diff --git a/dev-libs/beignet/beignet-1.3.2-r2.ebuild b/dev-libs/beignet/beignet-1.3.2-r2.ebuild |
23 |
new file mode 100644 |
24 |
index 00000000000..bc69b887c3d |
25 |
--- /dev/null |
26 |
+++ b/dev-libs/beignet/beignet-1.3.2-r2.ebuild |
27 |
@@ -0,0 +1,107 @@ |
28 |
+# Copyright 1999-2018 Gentoo Foundation |
29 |
+# Distributed under the terms of the GNU General Public License v2 |
30 |
+ |
31 |
+EAPI=6 |
32 |
+ |
33 |
+PYTHON_COMPAT=( python{2_7,3_4,3_5,3_6} ) |
34 |
+CMAKE_BUILD_TYPE="Release" |
35 |
+ |
36 |
+inherit python-any-r1 cmake-multilib flag-o-matic llvm toolchain-funcs |
37 |
+ |
38 |
+DESCRIPTION="OpenCL implementation for Intel GPUs" |
39 |
+HOMEPAGE="https://01.org/beignet" |
40 |
+ |
41 |
+LICENSE="LGPL-2.1+" |
42 |
+SLOT="0" |
43 |
+IUSE="ocl-icd ocl20" |
44 |
+ |
45 |
+if [[ "${PV}" == "9999" ]]; then |
46 |
+ inherit git-r3 |
47 |
+ EGIT_REPO_URI="https://anongit.freedesktop.org/git/beignet.git" |
48 |
+ KEYWORDS="" |
49 |
+else |
50 |
+ KEYWORDS="~amd64" |
51 |
+ SRC_URI="https://01.org/sites/default/files/${P}-source.tar.gz" |
52 |
+ S=${WORKDIR}/Beignet-${PV}-Source |
53 |
+fi |
54 |
+ |
55 |
+COMMON="media-libs/mesa[${MULTILIB_USEDEP}] |
56 |
+ <sys-devel/clang-6.0.9999:=[${MULTILIB_USEDEP}] |
57 |
+ >=x11-libs/libdrm-2.4.70[video_cards_intel,${MULTILIB_USEDEP}] |
58 |
+ x11-libs/libXext[${MULTILIB_USEDEP}] |
59 |
+ x11-libs/libXfixes[${MULTILIB_USEDEP}]" |
60 |
+RDEPEND="${COMMON} |
61 |
+ app-eselect/eselect-opencl" |
62 |
+DEPEND="${COMMON} |
63 |
+ ${PYTHON_DEPS} |
64 |
+ ocl-icd? ( dev-libs/ocl-icd ) |
65 |
+ virtual/pkgconfig" |
66 |
+ |
67 |
+LLVM_MAX_SLOT=6 |
68 |
+ |
69 |
+PATCHES=( |
70 |
+ "${FILESDIR}"/no-debian-multiarch.patch |
71 |
+ "${FILESDIR}"/${PN}-1.3.2_disable-doNegAddOptimization.patch |
72 |
+ "${FILESDIR}"/${PN}-1.3.2_cmake-llvm-config-multilib.patch |
73 |
+ "${FILESDIR}"/${PN}-1.3.2_llvm6.patch |
74 |
+ "${FILESDIR}"/${PN}-1.3.1-oclicd_no_upstream_icdfile.patch |
75 |
+ "${FILESDIR}"/${PN}-1.2.0_no-hardcoded-cflags.patch |
76 |
+ "${FILESDIR}"/llvm-terminfo.patch |
77 |
+) |
78 |
+ |
79 |
+DOCS=( |
80 |
+ docs/. |
81 |
+) |
82 |
+ |
83 |
+pkg_pretend() { |
84 |
+ if [[ ${MERGE_TYPE} != "binary" ]]; then |
85 |
+ if tc-is-gcc; then |
86 |
+ if [[ $(gcc-major-version) -eq 4 ]] && [[ $(gcc-minor-version) -lt 6 ]]; then |
87 |
+ eerror "Compilation with gcc older than 4.6 is not supported" |
88 |
+ die "Too old gcc found." |
89 |
+ fi |
90 |
+ fi |
91 |
+ fi |
92 |
+} |
93 |
+ |
94 |
+pkg_setup() { |
95 |
+ llvm_pkg_setup |
96 |
+ python_setup |
97 |
+} |
98 |
+ |
99 |
+src_prepare() { |
100 |
+ # See Bug #593968 |
101 |
+ append-flags -fPIC |
102 |
+ |
103 |
+ cmake-utils_src_prepare |
104 |
+ # We cannot run tests because they require permissions to access |
105 |
+ # the hardware, and building them is very time-consuming. |
106 |
+ cmake_comment_add_subdirectory utests |
107 |
+} |
108 |
+ |
109 |
+multilib_src_configure() { |
110 |
+ VENDOR_DIR="/usr/$(get_libdir)/OpenCL/vendors/${PN}" |
111 |
+ |
112 |
+ local mycmakeargs=( |
113 |
+ -DCMAKE_INSTALL_PREFIX="${EPREFIX}${VENDOR_DIR}" |
114 |
+ -DOCLICD_COMPAT=$(usex ocl-icd) |
115 |
+ $(usex ocl20 "" "-DENABLE_OPENCL_20=OFF") |
116 |
+ ) |
117 |
+ |
118 |
+ cmake-utils_src_configure |
119 |
+} |
120 |
+ |
121 |
+multilib_src_install() { |
122 |
+ VENDOR_DIR="/usr/$(get_libdir)/OpenCL/vendors/${PN}" |
123 |
+ |
124 |
+ cmake-utils_src_install |
125 |
+ |
126 |
+ insinto /etc/OpenCL/vendors/ |
127 |
+ echo "${EPREFIX}${VENDOR_DIR}/lib/${PN}/libcl.so" > "${PN}-${ABI}.icd" || die "Failed to generate ICD file" |
128 |
+ doins "${PN}-${ABI}.icd" |
129 |
+ |
130 |
+ dosym "lib/${PN}/libcl.so" "${VENDOR_DIR}"/libOpenCL.so.1 |
131 |
+ dosym "lib/${PN}/libcl.so" "${VENDOR_DIR}"/libOpenCL.so |
132 |
+ dosym "lib/${PN}/libcl.so" "${VENDOR_DIR}"/libcl.so.1 |
133 |
+ dosym "lib/${PN}/libcl.so" "${VENDOR_DIR}"/libcl.so |
134 |
+} |
135 |
|
136 |
diff --git a/dev-libs/beignet/files/beignet-1.3.2_disable-doNegAddOptimization.patch b/dev-libs/beignet/files/beignet-1.3.2_disable-doNegAddOptimization.patch |
137 |
new file mode 100644 |
138 |
index 00000000000..ae399b17f05 |
139 |
--- /dev/null |
140 |
+++ b/dev-libs/beignet/files/beignet-1.3.2_disable-doNegAddOptimization.patch |
141 |
@@ -0,0 +1,66 @@ |
142 |
+--- b/backend/src/backend/gen_insn_selection_optimize.cpp |
143 |
++++ a/backend/src/backend/gen_insn_selection_optimize.cpp |
144 |
+@@ -74,7 +74,8 @@ namespace gbe |
145 |
+ const GenRegister& replacement) : |
146 |
+ insn(insn), intermedia(intermedia), replacement(replacement) |
147 |
+ { |
148 |
+- assert(insn.opcode == SEL_OP_MOV || insn.opcode == SEL_OP_ADD); |
149 |
++ assert(insn.opcode == SEL_OP_MOV); |
150 |
++ assert(&(insn.src(0)) == &replacement); |
151 |
+ assert(&(insn.dst(0)) == &intermedia); |
152 |
+ this->elements = CalculateElements(intermedia, insn.state.execWidth); |
153 |
+ replacementOverwritten = false; |
154 |
+@@ -101,7 +102,6 @@ namespace gbe |
155 |
+ void doReplacement(ReplaceInfo* info); |
156 |
+ bool CanBeReplaced(const ReplaceInfo* info, const SelectionInstruction& insn, const GenRegister& var); |
157 |
+ void cleanReplaceInfoMap(); |
158 |
+- void doNegAddOptimization(SelectionInstruction &insn); |
159 |
+ |
160 |
+ SelectionBlock &bb; |
161 |
+ const ir::Liveness::LiveOut& liveout; |
162 |
+@@ -159,13 +159,8 @@ namespace gbe |
163 |
+ |
164 |
+ void SelBasicBlockOptimizer::addToReplaceInfoMap(SelectionInstruction& insn) |
165 |
+ { |
166 |
+- assert(insn.opcode == SEL_OP_MOV || insn.opcode == SEL_OP_ADD); |
167 |
+- GenRegister &src = insn.src(0); |
168 |
+- if (insn.opcode == SEL_OP_ADD) { |
169 |
+- if (src.file == GEN_IMMEDIATE_VALUE) |
170 |
+- src = insn.src(1); |
171 |
+- } |
172 |
+- |
173 |
++ assert(insn.opcode == SEL_OP_MOV); |
174 |
++ const GenRegister& src = insn.src(0); |
175 |
+ const GenRegister& dst = insn.dst(0); |
176 |
+ if (src.type != dst.type || src.file != dst.file) |
177 |
+ return; |
178 |
+@@ -254,29 +249,10 @@ namespace gbe |
179 |
+ |
180 |
+ if (insn.opcode == SEL_OP_MOV) |
181 |
+ addToReplaceInfoMap(insn); |
182 |
+- |
183 |
+- doNegAddOptimization(insn); |
184 |
+ } |
185 |
+ cleanReplaceInfoMap(); |
186 |
+ } |
187 |
+ |
188 |
+- /* LLVM transform Mad(a, -b, c) to |
189 |
+- Add b, -b, 0 |
190 |
+- Mad val, a, b, c |
191 |
+- for Gen support negtive modifier, mad(a, -b, c) is native suppoted. |
192 |
+- Also it can be used for the same like instruction sequence. |
193 |
+- Do it just like a: mov b, -b, so it is a Mov operation like LocalCopyPropagation |
194 |
+- */ |
195 |
+- void SelBasicBlockOptimizer::doNegAddOptimization(SelectionInstruction &insn) { |
196 |
+- if (insn.opcode == SEL_OP_ADD) { |
197 |
+- GenRegister src0 = insn.src(0); |
198 |
+- GenRegister src1 = insn.src(1); |
199 |
+- if ((src0.negation && src1.file == GEN_IMMEDIATE_VALUE && src1.value.f == 0.0f) || |
200 |
+- (src1.negation && src0.file == GEN_IMMEDIATE_VALUE && src0.value.f == 0.0f)) |
201 |
+- addToReplaceInfoMap(insn); |
202 |
+- } |
203 |
+- } |
204 |
+- |
205 |
+ void SelBasicBlockOptimizer::run() |
206 |
+ { |
207 |
+ for (size_t i = 0; i < MaxTries; ++i) { |