work around compiler bug for mips64el/-O3
Change-Id: Ia724455b8531f93623e97197cd7778a3297e38ba
Reviewed-on: https://skia-review.googlesource.com/c/162005
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
diff --git a/build.ninja b/build.ninja
index 4f76bd1..d8fc729 100644
--- a/build.ninja
+++ b/build.ninja
@@ -16,6 +16,7 @@
subninja build/gcc.avx512
subninja build/gcc.m32
subninja build/gcc.mips64el
+subninja build/gcc.mips64el-O3
subninja build/gcc.native
subninja build/gcc.portable
subninja build/gcc.tiny
diff --git a/build/gcc.mips64el-O3 b/build/gcc.mips64el-O3
new file mode 100644
index 0000000..42b58d3
--- /dev/null
+++ b/build/gcc.mips64el-O3
@@ -0,0 +1,16 @@
+mode = .mips64el-O3
+
+_toolchain = ../mips64el_toolchain_linux
+_env = env LD_LIBRARY_PATH=$_toolchain/lib/x86_64-linux-gnu
+
+out = out/gcc$mode
+cflags = -fdiagnostics-color -Wall -Wextra -ffp-contract=off -fstack-usage -O3
+cc = $_env $_toolchain/bin/mips64el-linux-gnuabi64-gcc-7
+cxx = $_env $_toolchain/bin/mips64el-linux-gnuabi64-g++-7
+
+rule run
+ command = touch $out
+ description = skipping $in
+include build/common
+
+disabled = (uname | grep -qv Linux)
diff --git a/src/Transform_inl.h b/src/Transform_inl.h
index 6135ddf..978a157 100644
--- a/src/Transform_inl.h
+++ b/src/Transform_inl.h
@@ -538,7 +538,16 @@
#endif
}
+// GCC 7.2.0 hits an internal compiler error with -finline-functions (or -O3)
+// when targeting MIPS 64, I think attempting to inline clut() into exec_ops().
+#if 1 && defined(__GNUC__) && !defined(__clang__) && defined(__mips64)
+ #define MAYBE_NOINLINE __attribute__((noinline))
+#else
+ #define MAYBE_NOINLINE
+#endif
+
template <int kBitDepth>
+MAYBE_NOINLINE
static void clut(const skcms_A2B* a2b, int dim, I32 ix, I32 stride, F* r, F* g, F* b, F a) {
if (dim == 0) {
sample_clut<kBitDepth>(a2b,ix, r,g,b);