arm: Enable MVE SIMD modes for vectorization
authorDennis Zhang <dennis.zh@live.com>
Tue, 6 Oct 2020 15:53:46 +0000 (16:53 +0100)
committerDennis Zhang <dennis.zh@live.com>
Tue, 6 Oct 2020 15:53:46 +0000 (16:53 +0100)
This patch enables SIMD modes for MVE auto-vectorization.
In this patch, the integer and float MVE SIMD modes are returned by
arm_preferred_simd_mode (TARGET_VECTORIZE_PREFERRED_SIMD_MODE hook) when
MVE or MVE_FLOAT is enabled. Then the expanders for auto-vectorization
can be used for generating MVE SIMD code.

This patch also fixes bugs in MVE vreiterpretq_*.c tests which are
revealed by the enabled MVE SIMD modes.
The tests are for checking the MVE reinterpret intrinsics.
There are two functions in each of the tests. The two functions contain
the pattern of identical code so that they are folded in icf pass.
Because of icf, the instruction count only checks one function which is
8. However when the SIMD modes are enabled, the estimation of the code
size becomes smaller so that inlining is applied after icf, then the
instruction count becomes 16 which causes failure of the tests.
Because the icf is not the expected pattern to be tested but causes
above issues, -fno-ipa-icf is applied to the tests to avoid unstable
instruction count.

gcc/ChangeLog:

2020-10-05  Dennis Zhang  <dennis.zhang@arm.com>

* config/arm/arm.c (arm_preferred_simd_mode): Enable MVE SIMD modes.

gcc/testsuite/ChangeLog:

2020-10-05  Dennis Zhang  <dennis.zhang@arm.com>

* gcc.target/arm/mve/intrinsics/vreinterpretq_f16.c: Use additional
option -fno-ipa-icf and change the instruction count from 8 to 16.
* gcc.target/arm/mve/intrinsics/vreinterpretq_f32.c: Likewise.
* gcc.target/arm/mve/intrinsics/vreinterpretq_s16.c: Likewise.
* gcc.target/arm/mve/intrinsics/vreinterpretq_s32.c: Likewise.
* gcc.target/arm/mve/intrinsics/vreinterpretq_s64.c: Likewise.
* gcc.target/arm/mve/intrinsics/vreinterpretq_s8.c: Likewise.
* gcc.target/arm/mve/intrinsics/vreinterpretq_u16.c: Likewise.
* gcc.target/arm/mve/intrinsics/vreinterpretq_u32.c: Likewise.
* gcc.target/arm/mve/intrinsics/vreinterpretq_u64.c: Likewise.
* gcc.target/arm/mve/intrinsics/vreinterpretq_u8.c: Likewise.

13 files changed:
gcc/ChangeLog
gcc/config/arm/arm.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/mve/intrinsics/vreinterpretq_f16.c
gcc/testsuite/gcc.target/arm/mve/intrinsics/vreinterpretq_f32.c
gcc/testsuite/gcc.target/arm/mve/intrinsics/vreinterpretq_s16.c
gcc/testsuite/gcc.target/arm/mve/intrinsics/vreinterpretq_s32.c
gcc/testsuite/gcc.target/arm/mve/intrinsics/vreinterpretq_s64.c
gcc/testsuite/gcc.target/arm/mve/intrinsics/vreinterpretq_s8.c
gcc/testsuite/gcc.target/arm/mve/intrinsics/vreinterpretq_u16.c
gcc/testsuite/gcc.target/arm/mve/intrinsics/vreinterpretq_u32.c
gcc/testsuite/gcc.target/arm/mve/intrinsics/vreinterpretq_u64.c
gcc/testsuite/gcc.target/arm/mve/intrinsics/vreinterpretq_u8.c

index cd3901b940ccb5280f1396915e4c7ad5cd3aeeae..743e49788579ddcf20c1c8b2134eb68233699232 100644 (file)
@@ -1,3 +1,7 @@
+2020-10-05  Dennis Zhang  <dennis.zhang@arm.com>
+
+       * config/arm/arm.c (arm_preferred_simd_mode): Enable MVE SIMD modes.
+
 2020-10-05  Aldy Hernandez  <aldyh@redhat.com>
 
        * value-range.cc (irange::legacy_intersect): Only handle
index bd7be8fde011fa6144039a54e5e2fb6d87b64813..5fdc14396361b90455728738244ae43e83a220bc 100644 (file)
@@ -28964,6 +28964,30 @@ arm_preferred_simd_mode (scalar_mode mode)
       default:;
       }
 
+  if (TARGET_HAVE_MVE)
+    switch (mode)
+      {
+      case QImode:
+       return V16QImode;
+      case HImode:
+       return V8HImode;
+      case SImode:
+       return V4SImode;
+
+      default:;
+      }
+
+  if (TARGET_HAVE_MVE_FLOAT)
+    switch (mode)
+      {
+      case HFmode:
+       return V8HFmode;
+      case SFmode:
+       return V4SFmode;
+
+      default:;
+      }
+
   return word_mode;
 }
 
index 5b92a025a4bc5cd8285aff1fd168b41b234d2c6a..703cc683fe72086c26dfb50c7be5f7c20b6dcf64 100644 (file)
@@ -1,3 +1,17 @@
+2020-10-05  Dennis Zhang  <dennis.zhang@arm.com>
+
+       * gcc.target/arm/mve/intrinsics/vreinterpretq_f16.c: Use additional
+       option -fno-ipa-icf and change the instruction count from 8 to 16.
+       * gcc.target/arm/mve/intrinsics/vreinterpretq_f32.c: Likewise.
+       * gcc.target/arm/mve/intrinsics/vreinterpretq_s16.c: Likewise.
+       * gcc.target/arm/mve/intrinsics/vreinterpretq_s32.c: Likewise.
+       * gcc.target/arm/mve/intrinsics/vreinterpretq_s64.c: Likewise.
+       * gcc.target/arm/mve/intrinsics/vreinterpretq_s8.c: Likewise.
+       * gcc.target/arm/mve/intrinsics/vreinterpretq_u16.c: Likewise.
+       * gcc.target/arm/mve/intrinsics/vreinterpretq_u32.c: Likewise.
+       * gcc.target/arm/mve/intrinsics/vreinterpretq_u64.c: Likewise.
+       * gcc.target/arm/mve/intrinsics/vreinterpretq_u8.c: Likewise.
+
 2020-10-05  Nathan Sidwell  <nathan@acm.org>
 
        * c-c++-common/spellcheck-reserved.c: Restore diagnostic.
index f59f69734ed5afb79762719511d7f9a70452453b..2398d89486171ca6a3b058db6d9aa5a0ca8e177a 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
 /* { dg-add-options arm_v8_1m_mve_fp } */
-/* { dg-additional-options "-O2" } */
+/* { dg-additional-options "-O2 -fno-ipa-icf" } */
 
 #include "arm_mve.h"
 int8x16_t value1;
@@ -41,4 +41,4 @@ foo1 ()
   return vaddq_f16 (r7, vreinterpretq_f16 (value9));
 }
 
-/* { dg-final { scan-assembler-times "vadd.f16" 8 } } */
+/* { dg-final { scan-assembler-times "vadd.f16" 16 } } */
index dac47c7e924fede5b250b46f69cdc1848cd3d650..5a58dc6eb4c627cb22e1005cd99b2a7ef2c99121 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
 /* { dg-add-options arm_v8_1m_mve_fp } */
-/* { dg-additional-options "-O2" } */
+/* { dg-additional-options "-O2 -fno-ipa-icf" } */
 
 #include "arm_mve.h"
 int16x8_t value1;
@@ -41,4 +41,4 @@ foo1 ()
   return vaddq_f32 (r7, vreinterpretq_f32 (value9));
 }
 
-/* { dg-final { scan-assembler-times "vadd.f32" 8 } } */
+/* { dg-final { scan-assembler-times "vadd.f32" 16 } } */
index edc2f2f3bc6b9423af3f389215860846ec7fa5ec..9ab05e9542007c5a2b76ceb2697764e124150b82 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
 /* { dg-add-options arm_v8_1m_mve_fp } */
-/* { dg-additional-options "-O2" } */
+/* { dg-additional-options "-O2 -fno-ipa-icf" } */
 
 #include "arm_mve.h"
 int8x16_t value1;
@@ -41,4 +41,4 @@ foo1 ()
   return vaddq_s16 (r7, vreinterpretq_s16 (value9));
 }
 
-/* { dg-final { scan-assembler-times "vadd.i16" 8 } } */
+/* { dg-final { scan-assembler-times "vadd.i16" 16 } } */
index 880de06a781927d2fccbc63250806608bc84b9d2..fbfff1fc1bb953ecfa6f96245ceb271267349e8f 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
 /* { dg-add-options arm_v8_1m_mve_fp } */
-/* { dg-additional-options "-O2" } */
+/* { dg-additional-options "-O2 -fno-ipa-icf" } */
 
 #include "arm_mve.h"
 int16x8_t value1;
@@ -41,4 +41,4 @@ foo1 ()
   return vaddq_s32 (r7, vreinterpretq_s32 (value9));
 }
 
-/* { dg-final { scan-assembler-times "vadd.i32" 8 } } */
+/* { dg-final { scan-assembler-times "vadd.i32" 16 } } */
index b0e8154295630ad3c8f5977ee554b83e06eaf863..beb6b927deb82bdae7d63ad58c2a0e703a8b8384 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
 /* { dg-add-options arm_v8_1m_mve_fp } */
-/* { dg-additional-options "-O2" } */
+/* { dg-additional-options "-O2 -fno-ipa-icf" } */
 
 #include "arm_mve.h"
 int16x8_t value1;
@@ -42,4 +42,4 @@ foo1 (mve_pred16_t __p)
   return vpselq_s64 (r7, vreinterpretq_s64 (value9), __p);
 }
 
-/* { dg-final { scan-assembler-times "vpsel" 8 } } */
+/* { dg-final { scan-assembler-times "vpsel" 16 } } */
index a5ceebb10b95d7de4b0381db9047e8e09e9a013b..727d89b63eece5218a401f9780257b04f1059e11 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
 /* { dg-add-options arm_v8_1m_mve_fp } */
-/* { dg-additional-options "-O2" } */
+/* { dg-additional-options "-O2 -fno-ipa-icf" } */
 
 #include "arm_mve.h"
 int16x8_t value1;
@@ -41,4 +41,4 @@ foo1 ()
   return vaddq_s8 (r7, vreinterpretq_s8 (value9));
 }
 
-/* { dg-final { scan-assembler-times "vadd.i8" 8 } } */
+/* { dg-final { scan-assembler-times "vadd.i8" 16 } } */
index cd31c23500a021cdd326d6ffe49264b9ff5d2e71..600f6d72a96d8f85c431cae3fd09dc1b1b4d084d 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
 /* { dg-add-options arm_v8_1m_mve_fp } */
-/* { dg-additional-options "-O2" } */
+/* { dg-additional-options "-O2 -fno-ipa-icf" } */
 
 #include "arm_mve.h"
 int8x16_t value1;
@@ -41,4 +41,4 @@ foo1 ()
   return vaddq_u16 (r7, vreinterpretq_u16 (value9));
 }
 
-/* { dg-final { scan-assembler-times "vadd.i16" 8 } } */
+/* { dg-final { scan-assembler-times "vadd.i16" 16 } } */
index faa66c9e1cc7815329dbf0d8000e2a36242fce21..d536ae825deef7610dd2dad93f1da856d3f12092 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
 /* { dg-add-options arm_v8_1m_mve_fp } */
-/* { dg-additional-options "-O2" } */
+/* { dg-additional-options "-O2 -fno-ipa-icf" } */
 
 #include "arm_mve.h"
 int16x8_t value1;
@@ -41,4 +41,4 @@ foo1 ()
   return vaddq_u32 (r7, vreinterpretq_u32 (value9));
 }
 
-/* { dg-final { scan-assembler-times "vadd.i32" 8 } } */
+/* { dg-final { scan-assembler-times "vadd.i32" 16 } } */
index 853b28a2aac45a07baa310456d93549a5eba3415..abc43612b9136c5dede8624b1ab4c6b073c93115 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
 /* { dg-add-options arm_v8_1m_mve_fp } */
-/* { dg-additional-options "-O2" } */
+/* { dg-additional-options "-O2 -fno-ipa-icf" } */
 
 #include "arm_mve.h"
 int16x8_t value1;
@@ -42,4 +42,4 @@ foo1 (mve_pred16_t __p)
   return vpselq_u64 (r7, vreinterpretq_u64 (value9), __p);
 }
 
-/* { dg-final { scan-assembler-times "vpsel" 8 } } */
+/* { dg-final { scan-assembler-times "vpsel" 16 } } */
index bdf8cd588e11147586ee8e3484d74a3fe190a8b7..c138e5b3668053c68037c168f0d9ab051cafe41f 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
 /* { dg-add-options arm_v8_1m_mve_fp } */
-/* { dg-additional-options "-O2" } */
+/* { dg-additional-options "-O2 -fno-ipa-icf" } */
 
 #include "arm_mve.h"
 int16x8_t value1;
@@ -41,4 +41,4 @@ foo1 ()
   return vaddq_u8 (r7, vreinterpretq_u8 (value9));
 }
 
-/* { dg-final { scan-assembler-times "vadd.i8" 8 } } */
+/* { dg-final { scan-assembler-times "vadd.i8" 16 } } */