]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Fix warning of gcc-12 with gather_pd/ps instructions 14027/head
authorMartin Kronbichler <martin.kronbichler@uni-a.de>
Mon, 20 Jun 2022 21:09:55 +0000 (23:09 +0200)
committerMatthias Maier <tamiko@43-1.org>
Tue, 21 Jun 2022 02:37:50 +0000 (21:37 -0500)
include/deal.II/base/vectorization.h

index 7f61b5ec8a105238ec7a775c2baaf939dfc27b25..c27f1cf22febb308361698c37ffec89ce1fabf8a 100644 (file)
@@ -1146,7 +1146,14 @@ public:
     const __m256 index_val =
       _mm256_loadu_ps(reinterpret_cast<const float *>(offsets));
     const __m256i index = *reinterpret_cast<const __m256i *>(&index_val);
-    data                = _mm512_i32gather_pd(index, base_ptr, 8);
+
+    // work around a warning with gcc-12 about an uninitialized initial state
+    // for gather by starting with a zero guess, even though all lanes will be
+    // overwritten
+    __m512d  zero = {};
+    __mmask8 mask = 0xFF;
+
+    data = _mm512_mask_i32gather_pd(zero, mask, index, base_ptr, 8);
   }
 
   /**
@@ -1704,7 +1711,14 @@ public:
     const __m512 index_val =
       _mm512_loadu_ps(reinterpret_cast<const float *>(offsets));
     const __m512i index = *reinterpret_cast<const __m512i *>(&index_val);
-    data                = _mm512_i32gather_ps(index, base_ptr, 4);
+
+    // work around a warning with gcc-12 about an uninitialized initial state
+    // for gather by starting with a zero guess, even though all lanes will be
+    // overwritten
+    __m512    zero = {};
+    __mmask16 mask = 0xFFFF;
+
+    data = _mm512_mask_i32gather_ps(zero, mask, index, base_ptr, 4);
   }
 
   /**
@@ -2359,7 +2373,14 @@ public:
     const __m128 index_val =
       _mm_loadu_ps(reinterpret_cast<const float *>(offsets));
     const __m128i index = *reinterpret_cast<const __m128i *>(&index_val);
-    data                = _mm256_i32gather_pd(base_ptr, index, 8);
+
+    // work around a warning with gcc-12 about an uninitialized initial state
+    // for gather by starting with a zero guess, even though all lanes will be
+    // overwritten
+    __m256d zero = _mm256_setzero_pd();
+    __m256d mask = _mm256_cmp_pd(zero, zero, _CMP_EQ_OQ);
+
+    data = _mm256_mask_i32gather_pd(zero, base_ptr, index, mask, 8);
 #    else
     for (unsigned int i = 0; i < 4; ++i)
       *(reinterpret_cast<double *>(&data) + i) = base_ptr[offsets[i]];
@@ -2876,7 +2897,14 @@ public:
     const __m256 index_val =
       _mm256_loadu_ps(reinterpret_cast<const float *>(offsets));
     const __m256i index = *reinterpret_cast<const __m256i *>(&index_val);
-    data                = _mm256_i32gather_ps(base_ptr, index, 4);
+
+    // work around a warning with gcc-12 about an uninitialized initial state
+    // for gather by starting with a zero guess, even though all lanes will be
+    // overwritten
+    __m256 zero = _mm256_setzero_ps();
+    __m256 mask = _mm256_cmp_ps(zero, zero, _CMP_EQ_OQ);
+
+    data = _mm256_mask_i32gather_ps(zero, base_ptr, index, mask, 4);
 #    else
     for (unsigned int i = 0; i < 8; ++i)
       *(reinterpret_cast<float *>(&data) + i) = base_ptr[offsets[i]];

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.