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);