]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/31152 (-(x>y) generates wrong code)
authorRichard Earnshaw <rearnsha@arm.com>
Sat, 23 Jun 2007 18:07:04 +0000 (18:07 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Sat, 23 Jun 2007 18:07:04 +0000 (18:07 +0000)
PR target/31152
* arm.md (negscc): Match the correct operand for optimized LT0 test.
Remove optimization for GT.
*gcc.c-torture/execute/20070623-1.c: New.

From-SVN: r125973

gcc/ChangeLog
gcc/config/arm/arm.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20070623-1.c [new file with mode: 0644]

index eff5188290e24c8d7d617b0b0c46a8b85d8ec182..9ea41e117635e0ab3f8014dea12d3a114df44580 100644 (file)
@@ -1,3 +1,9 @@
+2007-06-23  Richard Earnshaw  <rearnsha@arm.com>
+
+       PR target/31152
+       * arm.md (negscc): Match the correct operand for optimized LT0 test.
+       Remove optimization for GT.
+
 2007-06-23  Kenneth Zadeck <zadeck@naturalbridge.com>
 
        PR middle-end/32437
index 664f23d8fe86f85ecdd3a3aa5e0fdc4e5c06d214..5a8774e79ada7e7e1befeba465951628ce68cfa3 100644 (file)
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ARM"
   "*
-  if (GET_CODE (operands[3]) == LT && operands[3] == const0_rtx)
+  if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx)
     return \"mov\\t%0, %1, asr #31\";
 
   if (GET_CODE (operands[3]) == NE)
     return \"subs\\t%0, %1, %2\;mvnne\\t%0, #0\";
 
-  if (GET_CODE (operands[3]) == GT)
-    return \"subs\\t%0, %1, %2\;mvnne\\t%0, %0, asr #31\";
-
   output_asm_insn (\"cmp\\t%1, %2\", operands);
   output_asm_insn (\"mov%D3\\t%0, #0\", operands);
   return \"mvn%d3\\t%0, #0\";
index 435de150c8192866390edc0bb3b9da91c561559a..48c7ab65de4dd16a9e542acd5cee6f9357575551 100644 (file)
@@ -1,3 +1,7 @@
+2007-06-23  Richard Earnshaw  <rearnsha@arm.com>
+
+       * gcc.c-torture/execute/20070623-1.c: New.
+
 2007-06-22  Jan Hubicka  <jh@suse.cz>
 
        * gcc.c-torture/compile/pr31541.c: New.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20070623-1.c b/gcc/testsuite/gcc.c-torture/execute/20070623-1.c
new file mode 100644 (file)
index 0000000..e9c7d2a
--- /dev/null
@@ -0,0 +1,41 @@
+#include <limits.h>
+
+int __attribute__((noinline)) nge(int a, int b) {return -(a >= b);}
+int __attribute__((noinline)) ngt(int a, int b) {return -(a > b);}
+int __attribute__((noinline)) nle(int a, int b) {return -(a <= b);}
+int __attribute__((noinline)) nlt(int a, int b) {return -(a < b);}
+int __attribute__((noinline)) neq(int a, int b) {return -(a == b);}
+int __attribute__((noinline)) nne(int a, int b) {return -(a != b);}
+int __attribute__((noinline)) ngeu(unsigned a, unsigned b) {return -(a >= b);}
+int __attribute__((noinline)) ngtu(unsigned a, unsigned b) {return -(a > b);}
+int __attribute__((noinline)) nleu(unsigned a, unsigned b) {return -(a <= b);}
+int __attribute__((noinline)) nltu(unsigned a, unsigned b) {return -(a < b);}
+
+
+int main()
+{
+  if (nge(INT_MIN, INT_MAX) !=  0) abort();
+  if (nge(INT_MAX, INT_MIN) != -1) abort();
+  if (ngt(INT_MIN, INT_MAX) !=  0) abort();
+  if (ngt(INT_MAX, INT_MIN) != -1) abort();
+  if (nle(INT_MIN, INT_MAX) != -1) abort();
+  if (nle(INT_MAX, INT_MIN) !=  0) abort();
+  if (nlt(INT_MIN, INT_MAX) != -1) abort();
+  if (nlt(INT_MAX, INT_MIN) !=  0) abort();
+
+  if (neq(INT_MIN, INT_MAX) !=  0) abort();
+  if (neq(INT_MAX, INT_MIN) !=  0) abort();
+  if (nne(INT_MIN, INT_MAX) != -1) abort();
+  if (nne(INT_MAX, INT_MIN) != -1) abort();
+
+  if (ngeu(0, ~0U) !=  0) abort();
+  if (ngeu(~0U, 0) != -1) abort();
+  if (ngtu(0, ~0U) !=  0) abort();
+  if (ngtu(~0U, 0) != -1) abort();
+  if (nleu(0, ~0U) != -1) abort();
+  if (nleu(~0U, 0) !=  0) abort();
+  if (nltu(0, ~0U) != -1) abort();
+  if (nltu(~0U, 0) !=  0) abort();
+  
+  exit(0);
+}