Hi,

the attached patch modifies the builtin-bswap-6/7 testcases in order
to prevent GCC from using math instead of a compare.  Only with a
compare the folding in combine actually takes place.

Whether the return value is produce with a compare or not depends
again on the value of branch cost.

Ideally we would be able to do the folding also with the math trick
but it is probably not that easy since we have already lost the
information that in the end all we need is a 0 or a 1.

Ok?

Bye,

-Andreas-

2014-04-04  Andreas Krebbel  <andreas.kreb...@de.ibm.com>

        * gcc.dg/builtin-bswap-6.c: Adjust return value to disable GCC
        optimization.
        * gcc.dg/builtin-bswap-7.c: Likewise.

diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-6.c 
b/gcc/testsuite/gcc.dg/builtin-bswap-6.c
index 024ebf1..6f0c782 100644
--- a/gcc/testsuite/gcc.dg/builtin-bswap-6.c
+++ b/gcc/testsuite/gcc.dg/builtin-bswap-6.c
@@ -3,6 +3,10 @@
 /* { dg-options "-O -fdump-rtl-combine" } */
 /* { dg-options "-O -fdump-rtl-combine -march=z900" { target s390-*-* } } */
 
+/* The test intentionally returns 1/2 instead of the obvious 0/1 to
+   prevent GCC from calculating the return value with arithmetic
+   instead of a comparison.  */
+
 #include <stdint.h>
 
 #define BS(X) __builtin_bswap32(X)
@@ -11,28 +15,28 @@ int foo1 (uint32_t a)
 {
   if (BS (a) == 0xA0000)
     return 1;
-  return 0;
+  return 2;
 }
 
 int foo2 (uint32_t a)
 {
   if (BS (a) != 0xA0000)
     return 1;
-  return 0;
+  return 2;
 }
 
 int foo3 (uint32_t a, uint32_t b)
 {
   if (BS (a) == BS (b))
     return 1;
-  return 0;
+  return 2;
 }
 
 int foo4 (uint32_t a, uint32_t b)
 {
   if (BS (a) != BS (b))
     return 1;
-  return 0;
+  return 2;
 }
 
 /* { dg-final { scan-rtl-dump-not "bswapsi" "combine" } } */
diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-7.c 
b/gcc/testsuite/gcc.dg/builtin-bswap-7.c
index 399b825..0eecdd8 100644
--- a/gcc/testsuite/gcc.dg/builtin-bswap-7.c
+++ b/gcc/testsuite/gcc.dg/builtin-bswap-7.c
@@ -3,6 +3,10 @@
 /* { dg-require-effective-target lp64 } */
 /* { dg-options "-O -fdump-rtl-combine" } */
 
+/* The test intentionally returns 1/2 instead of the obvious 0/1 to
+   prevent GCC from calculating the return value with arithmetic
+   instead of a comparison.  */
+
 #include <stdint.h>
 
 #define BS(X) __builtin_bswap64(X)
@@ -11,28 +15,28 @@ int foo1 (uint64_t a)
 {
   if (BS (a) == 0xA00000000)
     return 1;
-  return 0;
+  return 2;
 }
 
 int foo2 (uint64_t a)
 {
   if (BS (a) != 0xA00000000)
     return 1;
-  return 0;
+  return 2;
 }
 
 int foo3 (uint64_t a, uint64_t b)
 {
   if (BS (a) == BS (b))
     return 1;
-  return 0;
+  return 2;
 }
 
 int foo4 (uint64_t a, uint64_t b)
 {
   if (BS (a) != BS (b))
     return 1;
-  return 0;
+  return 2;
 }
 
 /* { dg-final { scan-rtl-dump-not "bswapdi" "combine" } } */

Reply via email to