nvptx: Define TARGET_TRULY_NOOP_TRUNCATION to false
authorRoger Sayle <roger@nextmovesoftware.com>
Thu, 30 Jul 2020 09:42:06 +0000 (11:42 +0200)
committerTom de Vries <tdevries@suse.de>
Fri, 31 Jul 2020 17:12:25 +0000 (19:12 +0200)
Many thanks to Richard Biener for approving the midde-end
patch that cleared the way for this one.  This nvptx patch
defines the target hook TARGET_TRULY_NOOP_TRUNCATION to
false, indicating that integer truncations require explicit
instructions.  nvptx.c already defines TARGET_MODES_TIEABLE_P
and TARGET_CAN_CHANGE_MODE_CLASS to false, and as (previously)
documented that may require TARGET_TRULY_NOOP_TRUNCATION to
be defined likewise.

This patch decreases the number of unexpected failures in
the testsuite by 10, and increases the number of expected
passes by 4, including these previous FAILs/ICEs:
gcc.c-torture/compile/opout.c
gcc.dg/torture/pr79125.c
gcc.dg/tree-ssa/pr92085-1.c

Unfortunately there is one testsuite failure that used to
pass gcc.target/nvptx/v2si-cvt.c, but this isn't an ICE or
incorrect code.  This regression has been filed as PR96403,
and the failing scan-assembler directives have been replaced
by a reference to the PR.

This patch has been tested on nvptx-none hosted on
x86_64-pc-linux-gnu with "make" and "make check" with
fewer ICEs and no wrong code regressions.

2020-07-31  Roger Sayle  <roger@nextmovesoftware.com>
    Tom de Vries  <tdevries@suse.de>

gcc/ChangeLog:

PR target/90928
* config/nvptx/nvptx.c (nvptx_truly_noop_truncation): Implement.
(TARGET_TRULY_NOOP_TRUNCATION): Define.

gcc/testsuite/ChangeLog:

* gcc.target/nvptx/v2si-cvt.c: Simplify source.  Remove
scan-assembler directives.  Mention PR96403.

gcc/config/nvptx/nvptx.c
gcc/testsuite/gcc.target/nvptx/v2si-cvt.c

index d2f321fcbcc975ab91b557abea4192b80d9c935b..d8a8fb2d55b6920002e7835581b5bc0aadca3ce0 100644 (file)
@@ -6463,6 +6463,14 @@ nvptx_can_change_mode_class (machine_mode, machine_mode, reg_class_t)
   return false;
 }
 
+/* Implement TARGET_TRULY_NOOP_TRUNCATION.  */
+
+static bool
+nvptx_truly_noop_truncation (poly_uint64, poly_uint64)
+{
+  return false;
+}
+
 static GTY(()) tree nvptx_previous_fndecl;
 
 static void
@@ -6612,6 +6620,9 @@ nvptx_set_current_function (tree fndecl)
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS nvptx_can_change_mode_class
 
+#undef TARGET_TRULY_NOOP_TRUNCATION
+#define TARGET_TRULY_NOOP_TRUNCATION nvptx_truly_noop_truncation
+
 #undef TARGET_HAVE_SPECULATION_SAFE_VALUE
 #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
 
index 73f86bcfa9e3d0066ef6e6bd73df7e9396230125..35b9fc3ce26b080e684a46dc18994c6e93976582 100644 (file)
@@ -3,37 +3,25 @@
 
 typedef int __v2si __attribute__((__vector_size__(8)));
 
-int __attribute__((unused))
+__v2si __attribute__((unused))
 vector_cvt (__v2si arg)
 {
-  __v2si val4 = arg;
-  char *p = (char*)&val4;
+  unsigned short *p = (unsigned short*)&arg;
 
-  if (p[0] != 1)
-    return 1;
-  if (p[1] != 2)
-    return 1;
-  if (p[2] != 3)
-    return 1;
+  volatile unsigned short s = p[0];
 
-  return 0;
+  return arg;
 }
 
-int
-vector_cvt_2 (__v2si val, __v2si val2)
+__v2si __attribute__((unused))
+vector_cvt_2 (__v2si arg)
 {
-  char *p = (char*)&val;
-  char *p2 = (char*)&val2;
+  unsigned char *p = (unsigned char*)&arg;
 
-  if (p[0] != p2[0])
-    return 1;
-  if (p[4] != p2[4])
-    return 1;
+  volatile unsigned char s = p[0];
 
-  return 0;
+  return arg;
 }
 
-/* We want to test for 'mov.t' here, but given PR80845 we test for cvt.t.t
-   instead.
-   { dg-final { scan-assembler "(?n)cvt\\.u32\\.u32.*\\.x" } } */
-/* { dg-final { scan-assembler "(?n)cvt\\.u16\\.u32.*\\.x" } } */
+/* Todo: We'd like to generate insns with .x operands to access the v2si
+   operands, but that's currently not done, see PR96403.  */