]> gcc.gnu.org Git - gcc.git/commitdiff
nvptx: do not use alternative spelling of unsigned comparisons
authorAlexander Monakov <amonakov@ispras.ru>
Tue, 2 Feb 2016 18:24:25 +0000 (21:24 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Tue, 2 Feb 2016 18:24:25 +0000 (21:24 +0300)
gcc/ChangeLog:
* config/nvptx/nvptx.c (nvptx_print_operand): Treat LEU, GEU, LTU, GTU
        like LE, GE, LT, GT when emitting relational operator.

gcc/testsuite/ChangeLog:
* gcc.target/nvptx/unsigned-cmp.c: New test.

From-SVN: r233088

gcc/ChangeLog
gcc/config/nvptx/nvptx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/nvptx/unsigned-cmp.c [new file with mode: 0644]

index 0e72ed1d0585b622213574ff83e02a1878e75d18..e8338107f18cff315483afd72caf1556ce8a4a58 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-02  Alexander Monakov  <amonakov@ispras.ru>
+
+       * config/nvptx/nvptx.c (nvptx_print_operand): Treat LEU, GEU, LTU, GTU
+       like LE, GE, LT, GT when emitting relational operator.
+
 2016-02-02  Wilco Dijkstra  <wdijkstr@arm.com>
 
        * ira-costs.c (find_costs_and_classes): Add extra argument.
index 1dadfc57fec941cb3bfa89ade6a0401dddc9deb8..78614f8a2d77bb32561d47d43ffc7fb6c5b540c1 100644 (file)
@@ -2031,28 +2031,20 @@ nvptx_print_operand (FILE *file, rtx x, int code)
            fputs (".ne", file);
          break;
        case LE:
+       case LEU:
          fputs (".le", file);
          break;
        case GE:
+       case GEU:
          fputs (".ge", file);
          break;
        case LT:
+       case LTU:
          fputs (".lt", file);
          break;
        case GT:
-         fputs (".gt", file);
-         break;
-       case LEU:
-         fputs (".ls", file);
-         break;
-       case GEU:
-         fputs (".hs", file);
-         break;
-       case LTU:
-         fputs (".lo", file);
-         break;
        case GTU:
-         fputs (".hi", file);
+         fputs (".gt", file);
          break;
        case LTGT:
          fputs (".ne", file);
index 5229fa1868ffa248bb23f4c0f05ed84ad3c8709c..6da1f381b6c236177b517f2be90e58adb5365445 100644 (file)
@@ -1,3 +1,7 @@
+2016-02-02  Alexander Monakov  <amonakov@ispras.ru>
+
+       * gcc.target/nvptx/unsigned-cmp.c: New test.
+
 2016-02-02  Wilco Dijkstra  <wdijkstr@arm.com>
 
        * gcc.target/aarch64/scalar_shift_1.c
diff --git a/gcc/testsuite/gcc.target/nvptx/unsigned-cmp.c b/gcc/testsuite/gcc.target/nvptx/unsigned-cmp.c
new file mode 100644 (file)
index 0000000..a0cf5c2
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-options "-O2" } */
+/* { dg-do run } */
+
+/* nvptx backend used to emit lo/ls/hs/hi suffixes on unsigned comparison
+   insns instead of the more common lt/le/ge/gt, but ptxas and PTX JIT
+   miscompile 'ls' and 'hi' under some circumstances, such as when the first
+   source operand expands to a constant memory load, as demonstrated below.
+   Reported as NVIDIA bug ID 1725195 (tracker is not public).  */
+
+/* Define this to observe PTX translation breakage.  */
+//#define EMIT_BROKEN_ASM 1
+
+/* Or define this to get expected codegen.  */
+//#define EMIT_WORKING_ASM 1
+
+static __attribute__((noinline,noclone)) int ls(unsigned a)
+{
+    unsigned v;
+    /* %nctaid.x is always 1 in gcc testing.  */
+    asm ("mov.u32 %0, %%nctaid.x;" : "=r"(v));
+#if defined(EMIT_BROKEN_ASM)
+    asm ("set.u32.ls.u32 %0, %1, %0;" : "+r"(a) : "r"(v));
+#elif defined(EMIT_WORKING_ASM)
+    asm ("set.u32.le.u32 %0, %1, %0;" : "+r"(a) : "r"(v));
+#else
+    a = v <= a ? -1 : 0;
+#endif
+    return a;
+}
+static __attribute__((noinline,noclone)) int hi(unsigned a)
+{
+    unsigned v;
+    asm ("mov.u32 %0, %%nctaid.x;" : "=r"(v));
+#if defined(EMIT_BROKEN_ASM)
+    asm ("set.u32.hi.u32 %0, %1, %0;" : "+r"(a) : "r"(v));
+#elif defined(EMIT_WORKING_ASM)
+    asm ("set.u32.gt.u32 %0, %1, %0;" : "+r"(a) : "r"(v));
+#else
+    a = v > a ? -1 : 0;
+#endif
+    return a;
+}
+int main()
+{
+    int i;
+    for (i=0; i<3; i++)
+        if (ls(i) != -(1 <= i) || hi(i) != -(1 > i))
+            __builtin_abort();
+    return 0;
+}
This page took 0.076313 seconds and 5 git commands to generate.