From 3de26ff3d7aebc8a2529d58ee9a3fa1c0f6cde3a Mon Sep 17 00:00:00 2001
From: Barry Smith <bsmith@mcs.anl.gov>
Date: Tue, 25 Oct 2016 13:12:22 -0500
Subject: [PATCH] openblas: Fixes to get OpenBLAS to install with Intel
 compilers (#2101)

Funded-by: IDEAS
Project: IDEAS/xSDK
Time: 1 hour
---
 .../packages/openblas/openblas_icc.patch      | 253 ++++++++++++++++++
 .../builtin/packages/openblas/package.py      |   5 +
 2 files changed, 258 insertions(+)
 create mode 100644 var/spack/repos/builtin/packages/openblas/openblas_icc.patch

diff --git a/var/spack/repos/builtin/packages/openblas/openblas_icc.patch b/var/spack/repos/builtin/packages/openblas/openblas_icc.patch
new file mode 100644
index 0000000000..fb379aea41
--- /dev/null
+++ b/var/spack/repos/builtin/packages/openblas/openblas_icc.patch
@@ -0,0 +1,253 @@
+diff --git a/kernel/x86_64/cscal_microk_bulldozer-2.c b/kernel/x86_64/cscal_microk_bulldozer-2.c
+index f470cf8..3abffc4 100644
+--- a/kernel/x86_64/cscal_microk_bulldozer-2.c
++++ b/kernel/x86_64/cscal_microk_bulldozer-2.c
+@@ -120,7 +120,7 @@ static void cscal_kernel_16( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -212,7 +212,7 @@ static void cscal_kernel_16_zero_r( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -289,7 +289,7 @@ static void cscal_kernel_16_zero_i( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -334,7 +334,7 @@ static void cscal_kernel_16_zero( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+diff --git a/kernel/x86_64/cscal_microk_haswell-2.c b/kernel/x86_64/cscal_microk_haswell-2.c
+index 0424de3..48e3395 100644
+--- a/kernel/x86_64/cscal_microk_haswell-2.c
++++ b/kernel/x86_64/cscal_microk_haswell-2.c
+@@ -120,7 +120,7 @@ static void cscal_kernel_16( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "0", "1",
++	: "cc", //"0", "1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -212,7 +212,7 @@ static void cscal_kernel_16_zero_r( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "0", "1",
++	: "cc", // "0", "1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -289,7 +289,7 @@ static void cscal_kernel_16_zero_i( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -334,7 +334,7 @@ static void cscal_kernel_16_zero( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "0", "1",
++	: "cc", //"0", "1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+diff --git a/kernel/x86_64/cscal_microk_steamroller-2.c b/kernel/x86_64/cscal_microk_steamroller-2.c
+index 763e7ad..8346e17 100644
+--- a/kernel/x86_64/cscal_microk_steamroller-2.c
++++ b/kernel/x86_64/cscal_microk_steamroller-2.c
+@@ -121,7 +121,7 @@ static void cscal_kernel_16( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "0", "1",
++	: "cc", //"0", "1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -213,7 +213,7 @@ static void cscal_kernel_16_zero_r( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "0", "1",
++	: "cc", //"0", "1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -290,7 +290,7 @@ static void cscal_kernel_16_zero_i( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -335,7 +335,7 @@ static void cscal_kernel_16_zero( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "0", "1",
++	: "cc", //"0", "1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+diff --git a/kernel/x86_64/dscal.c b/kernel/x86_64/dscal.c
+index bbc1c96..b6bde6c 100644
+--- a/kernel/x86_64/dscal.c
++++ b/kernel/x86_64/dscal.c
+@@ -141,7 +141,7 @@ static void dscal_kernel_inc_8(BLASLONG n, FLOAT *alpha, FLOAT *x, BLASLONG inc_
+           "r" (alpha),  // 3
+           "r" (inc_x),  // 4
+           "r" (inc_x3)  // 5
+-        : "cc", "%0", "%1", "%2",
++        : "cc", //"%0", "%1", "%2",
+           "%xmm0", "%xmm1", "%xmm2", "%xmm3",
+           "%xmm4", "%xmm5", "%xmm6", "%xmm7",
+           "%xmm8", "%xmm9", "%xmm10", "%xmm11",
+diff --git a/kernel/x86_64/zscal_microk_bulldozer-2.c b/kernel/x86_64/zscal_microk_bulldozer-2.c
+index 28fe734..03882d6 100644
+--- a/kernel/x86_64/zscal_microk_bulldozer-2.c
++++ b/kernel/x86_64/zscal_microk_bulldozer-2.c
+@@ -120,7 +120,7 @@ static void zscal_kernel_8( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -212,7 +212,7 @@ static void zscal_kernel_8_zero_r( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -289,7 +289,7 @@ static void zscal_kernel_8_zero_i( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -334,7 +334,7 @@ static void zscal_kernel_8_zero( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+diff --git a/kernel/x86_64/zscal_microk_haswell-2.c b/kernel/x86_64/zscal_microk_haswell-2.c
+index a93308e..b1a34c1 100644
+--- a/kernel/x86_64/zscal_microk_haswell-2.c
++++ b/kernel/x86_64/zscal_microk_haswell-2.c
+@@ -120,7 +120,7 @@ static void zscal_kernel_8( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -212,7 +212,7 @@ static void zscal_kernel_8_zero_r( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -289,7 +289,7 @@ static void zscal_kernel_8_zero_i( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -334,7 +334,7 @@ static void zscal_kernel_8_zero( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+diff --git a/kernel/x86_64/zscal_microk_steamroller-2.c b/kernel/x86_64/zscal_microk_steamroller-2.c
+index d611bf5..97b07ad 100644
+--- a/kernel/x86_64/zscal_microk_steamroller-2.c
++++ b/kernel/x86_64/zscal_microk_steamroller-2.c
+@@ -121,7 +121,7 @@ static void zscal_kernel_8( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -213,7 +213,7 @@ static void zscal_kernel_8_zero_r( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -290,7 +290,7 @@ static void zscal_kernel_8_zero_i( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
+@@ -335,7 +335,7 @@ static void zscal_kernel_8_zero( BLASLONG n, FLOAT *alpha, FLOAT *x)
+ 	  "r" (n),  	// 0
+           "r" (x),      // 1
+           "r" (alpha)   // 2
+-	: "cc", "%0", "%1",
++	: "cc", //"%0", "%1",
+ 	  "%xmm0", "%xmm1", "%xmm2", "%xmm3", 
+ 	  "%xmm4", "%xmm5", "%xmm6", "%xmm7", 
+ 	  "%xmm8", "%xmm9", "%xmm10", "%xmm11", 
diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py
index 1f6dd0e013..efdbc1d8b2 100644
--- a/var/spack/repos/builtin/packages/openblas/package.py
+++ b/var/spack/repos/builtin/packages/openblas/package.py
@@ -50,6 +50,9 @@ class Openblas(Package):
     provides('lapack')
 
     patch('make.patch')
+    #  This patch is in a pull request to OpenBLAS that has not been handled
+    #  https://github.com/xianyi/OpenBLAS/pull/915
+    patch('openblas_icc.patch', when='%intel')
 
     @property
     def blas_libs(self):
@@ -124,6 +127,8 @@ def check_install(self, spec):
 
         include_flags = ["-I%s" % join_path(spec.prefix, "include")]
         link_flags = self.lapack_libs.ld_flags.split()
+        if self.compiler.name == 'intel':
+            link_flags.extend(["-lifcore"])
         link_flags.extend(["-lpthread"])
         if '+openmp' in spec:
             link_flags.extend([self.compiler.openmp_flag])
-- 
GitLab