re PR target/91323 (LTGT rtx produces UCOMISS instead of COMISS)
authorUros Bizjak <ubizjak@gmail.com>
Fri, 2 Aug 2019 09:58:04 +0000 (11:58 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 2 Aug 2019 09:58:04 +0000 (11:58 +0200)
PR target/91323
* config/i386/i386-expand.c (ix86_unordered_fp_compare) <case LTGT>:
Return false.

testsuite/ChangeLog:

PR target/91323
* gcc.dg/torture/pr91323.c: New test.

From-SVN: r274005

gcc/ChangeLog
gcc/config/i386/i386-expand.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr91323.c [new file with mode: 0644]

index c0e3cd84d7b612acf9aa29c1798189566bfb8395..a523bf053a9317f95f4b0ef9d38476033488e7f5 100644 (file)
@@ -1,3 +1,9 @@
+2019-08-02  Uroš Bizjak  <ubizjak@gmail.com>
+
+       PR target/91323
+       * config/i386/i386-expand.c (ix86_unordered_fp_compare) <case LTGT>:
+       Return false.
+
 2019-08-02  Richard Biener  <rguenther@suse.de>
 
        * vec.h (vec::sort): Add gcc_qsort_r support.
index 6e4ae5077f56918c3b02a173d67dbb653795e2fd..f6e6d68eed25c7c98391c0b7b0eb90bcfbfccaf7 100644 (file)
@@ -2286,16 +2286,16 @@ ix86_unordered_fp_compare (enum rtx_code code)
 
   switch (code)
     {
-    case GT:
-    case GE:
     case LT:
     case LE:
+    case GT:
+    case GE:
+    case LTGT:
       return false;
 
     case EQ:
     case NE:
 
-    case LTGT:
     case UNORDERED:
     case ORDERED:
     case UNLT:
index 58a26d11f0f8a3451eedbb71a8ffce91bf89b3b2..36dbcc86812b87d697acbcfee14c6b320dca1ffa 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-02  Uroš Bizjak  <ubizjak@gmail.com>
+
+       PR target/91323
+       * gcc.dg/torture/pr91323.c: New test.
+
 2019-08-02  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * g++.dg/cpp1z/nodiscard6.C: New.
diff --git a/gcc/testsuite/gcc.dg/torture/pr91323.c b/gcc/testsuite/gcc.dg/torture/pr91323.c
new file mode 100644 (file)
index 0000000..3da2dfb
--- /dev/null
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-add-options ieee } */
+/* { dg-require-effective-target fenv_exceptions } */
+
+#include <fenv.h>
+
+int
+__attribute__ ((noinline, noclone))
+f1 (float a, float b)
+{
+  return __builtin_isless (a, b) || __builtin_isgreater (a, b);
+}
+
+int
+__attribute__ ((noinline, noclone))
+f2 (float a, float b)
+{
+  return __builtin_islessgreater (a, b);
+}
+
+int
+__attribute__ ((noinline, noclone))
+f3 (float a, float b)
+{
+  return a < b || a > b;
+}
+
+int
+main (void)
+{
+  volatile int r;
+
+  float nanf = __builtin_nanf ("");
+  float argf = 1.0f;
+
+  feclearexcept (FE_INVALID);
+
+  r = f1 (nanf, argf);
+  if (fetestexcept (FE_INVALID))
+    __builtin_abort ();
+
+  r = f2 (nanf, argf);
+  if (fetestexcept (FE_INVALID))
+    __builtin_abort ();
+
+  r = f3 (nanf, argf);
+  if (!fetestexcept (FE_INVALID))
+    __builtin_abort ();
+
+  return 0;
+}