diff options
author | Alexander Monakov <amonakov@ispras.ru> | 2016-02-02 21:24:25 +0300 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2016-02-02 21:24:25 +0300 |
commit | 578fb2259b0f644142f9a795a3fc433cba5f2da6 (patch) | |
tree | 4b31fb4018f1c38c7ac6a75b0010d2607fbc265c /gcc | |
parent | 5854ee30ca7854754006da22380bec498e5c2d29 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/nvptx/nvptx.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/nvptx/unsigned-cmp.c | 50 |
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; +} |