From: Alexander Monakov Date: Tue, 2 Feb 2016 18:24:25 +0000 (+0300) Subject: nvptx: do not use alternative spelling of unsigned comparisons X-Git-Tag: basepoints/gcc-7~1151 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=578fb2259b0f644142f9a795a3fc433cba5f2da6;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0e72ed1d0585..e8338107f18c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-02-02 Alexander Monakov + + * 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 * 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 1dadfc57fec9..78614f8a2d77 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 5229fa1868ff..6da1f381b6c2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-02-02 Alexander Monakov + + * gcc.target/nvptx/unsigned-cmp.c: New test. + 2016-02-02 Wilco Dijkstra * 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 000000000000..a0cf5c2d4680 --- /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; +}