aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexander Monakov <amonakov@ispras.ru>2016-02-02 21:24:25 +0300
committerAlexander Monakov <amonakov@gcc.gnu.org>2016-02-02 21:24:25 +0300
commit578fb2259b0f644142f9a795a3fc433cba5f2da6 (patch)
tree4b31fb4018f1c38c7ac6a75b0010d2607fbc265c /gcc
parent5854ee30ca7854754006da22380bec498e5c2d29 (diff)
downloadgcc-578fb2259b0f644142f9a795a3fc433cba5f2da6.zip
gcc-578fb2259b0f644142f9a795a3fc433cba5f2da6.tar.gz
gcc-578fb2259b0f644142f9a795a3fc433cba5f2da6.tar.bz2
nvptx: do not use alternative spelling of unsigned comparisons
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/nvptx/nvptx.c16
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/nvptx/unsigned-cmp.c50
4 files changed, 63 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0e72ed1..e833810 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index 1dadfc5..78614f8 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5229fa1..6da1f38 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..a0cf5c2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/nvptx/unsigned-cmp.c
@@ -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;
+}