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
This commit is contained in:
parent
5854ee30ca
commit
578fb2259b
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue