re PR target/39501 (-O -ffinite-math-only gets min(x,y) optimization wrong for soft...
authorRichard Earnshaw <rearnsha@arm.com>
Sat, 4 Apr 2009 10:37:10 +0000 (10:37 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Sat, 4 Apr 2009 10:37:10 +0000 (10:37 +0000)
PR target/39501
* arm.md (movsfcc): Disable if not TARGET_HARD_FLOAT.
* testsuite/gcc.c-torture/execute/pr39501.c: New file.
* testsuite/gcc.c-torture/execute/pr39501.x: New file.

From-SVN: r145534

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

index 69fbfd5..223ebaf 100644 (file)
@@ -1,3 +1,10 @@
+2009-04-04  Richard Earnshaw  <rearnsha@arm.com>
+
+       PR target/39501
+       * arm.md (movsfcc): Disable if not TARGET_HARD_FLOAT.
+       * testsuite/gcc.c-torture/execute/pr39501.c: New file.
+       * testsuite/gcc.c-torture/execute/pr39501.x: New file.
+
 2009-04-04  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/8781
index 3128094..ff217e0 100644 (file)
        (if_then_else:SF (match_operand 1 "arm_comparison_operator" "")
                         (match_operand:SF 2 "s_register_operand" "")
                         (match_operand:SF 3 "nonmemory_operand" "")))]
-  "TARGET_32BIT"
+  "TARGET_32BIT && TARGET_HARD_FLOAT"
   "
   {
     enum rtx_code code = GET_CODE (operands[1]);
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr39501.c b/gcc/testsuite/gcc.c-torture/execute/pr39501.c
new file mode 100644 (file)
index 0000000..3749d6e
--- /dev/null
@@ -0,0 +1,83 @@
+/* { dg-options "-ffast-math" } */
+#define min1(a,b) ((a) < (b) ? (a) : (b))
+#define max1(a,b) ((a) > (b) ? (a) : (b))
+
+#define min2(a,b) ((a) <= (b) ? (a) : (b))
+#define max2(a,b) ((a) >= (b) ? (a) : (b))
+
+#define F(type,n)                                              \
+  type __attribute__((noinline)) type##_##n(type a, type b)    \
+  {                                                            \
+    return n(a, b);                                            \
+  }
+
+F(float,min1)
+F(float,min2)
+F(float,max1)
+F(float,max2)
+
+F(double,min1)
+F(double,min2)
+F(double,max1)
+F(double,max2)
+
+int main()
+{
+  if (float_min1(0.f, -1.f) != -1.f) abort();
+  if (float_min1(-1.f, 0.f) != -1.f) abort();
+  if (float_min1(0.f, 1.f)  != 0.f)  abort();
+  if (float_min1(1.f, 0.f)  != 0.f)  abort();
+  if (float_min1(-1.f, 1.f) != -1.f) abort();
+  if (float_min1(1.f, -1.f) != -1.f) abort();
+  
+  if (float_max1(0.f, -1.f) != 0.f)  abort();
+  if (float_max1(-1.f, 0.f) != 0.f)  abort();
+  if (float_max1(0.f, 1.f)  != 1.f)  abort();
+  if (float_max1(1.f, 0.f)  != 1.f)  abort();
+  if (float_max1(-1.f, 1.f) != 1.f)  abort();
+  if (float_max1(1.f, -1.f) != 1.f)  abort();
+  
+  if (float_min2(0.f, -1.f) != -1.f) abort();
+  if (float_min2(-1.f, 0.f) != -1.f) abort();
+  if (float_min2(0.f, 1.f)  != 0.f)  abort();
+  if (float_min2(1.f, 0.f)  != 0.f)  abort();
+  if (float_min2(-1.f, 1.f) != -1.f) abort();
+  if (float_min2(1.f, -1.f) != -1.f) abort();
+  
+  if (float_max2(0.f, -1.f) != 0.f)  abort();
+  if (float_max2(-1.f, 0.f) != 0.f)  abort();
+  if (float_max2(0.f, 1.f)  != 1.f)  abort();
+  if (float_max2(1.f, 0.f)  != 1.f)  abort();
+  if (float_max2(-1.f, 1.f) != 1.f)  abort();
+  if (float_max2(1.f, -1.f) != 1.f)  abort();
+  
+  if (double_min1(0., -1.) != -1.) abort();
+  if (double_min1(-1., 0.) != -1.) abort();
+  if (double_min1(0., 1.)  != 0.)  abort();
+  if (double_min1(1., 0.)  != 0.)  abort();
+  if (double_min1(-1., 1.) != -1.) abort();
+  if (double_min1(1., -1.) != -1.) abort();
+  
+  if (double_max1(0., -1.) != 0.)  abort();
+  if (double_max1(-1., 0.) != 0.)  abort();
+  if (double_max1(0., 1.)  != 1.)  abort();
+  if (double_max1(1., 0.)  != 1.)  abort();
+  if (double_max1(-1., 1.) != 1.)  abort();
+  if (double_max1(1., -1.) != 1.)  abort();
+  
+  if (double_min2(0., -1.) != -1.) abort();
+  if (double_min2(-1., 0.) != -1.) abort();
+  if (double_min2(0., 1.)  != 0.)  abort();
+  if (double_min2(1., 0.)  != 0.)  abort();
+  if (double_min2(-1., 1.) != -1.) abort();
+  if (double_min2(1., -1.) != -1.) abort();
+  
+  if (double_max2(0., -1.) != 0.)  abort();
+  if (double_max2(-1., 0.) != 0.)  abort();
+  if (double_max2(0., 1.)  != 1.)  abort();
+  if (double_max2(1., 0.)  != 1.)  abort();
+  if (double_max2(-1., 1.) != 1.)  abort();
+  if (double_max2(1., -1.) != 1.)  abort();
+  
+  exit(0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr39501.x b/gcc/testsuite/gcc.c-torture/execute/pr39501.x
new file mode 100644 (file)
index 0000000..72527d7
--- /dev/null
@@ -0,0 +1,2 @@
+set additional_flags "-ffast-math"
+return 0