fold-const.c (negate_mathfn_p): Add BUILT_IN_ERF.
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>
Sat, 11 Nov 2006 04:01:42 +0000 (04:01 +0000)
committerKaveh Ghazi <ghazi@gcc.gnu.org>
Sat, 11 Nov 2006 04:01:42 +0000 (04:01 +0000)
* fold-const.c (negate_mathfn_p): Add BUILT_IN_ERF.

testsuite:
* gcc.dg/torture/builtin-symmetric-1.c: New test.

From-SVN: r118682

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/builtin-symmetric-1.c [new file with mode: 0644]

index 7f38662fced496a876ce71f485ec0379a1f0fea6..a4c855391a8762cb4d8ccc7372d69b17a753ea72 100644 (file)
@@ -1,3 +1,7 @@
+2006-11-10  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * fold-const.c (negate_mathfn_p): Add BUILT_IN_ERF.
+
 2006-11-10  Roger Sayle  <roger@eyesopen.com>
 
        * tree.c (build_int_cst_wide): Add an assertion (gcc_unreachable)
index 6016a702d69c240a45a9be296d24e20178f93542..fedc3cad7e627489f6d142868ed21fe3dd58e9f5 100644 (file)
@@ -894,6 +894,7 @@ negate_mathfn_p (enum built_in_function code)
     CASE_FLT_FN (BUILT_IN_SINH):
     CASE_FLT_FN (BUILT_IN_TAN):
     CASE_FLT_FN (BUILT_IN_TANH):
+    CASE_FLT_FN (BUILT_IN_ERF):
       return true;
 
     default:
index 3880cb9f224868c3a08350edcaff8cd633f7cb2e..7566130247f3acba58fe816fbd472901a6c4449c 100644 (file)
@@ -1,3 +1,7 @@
+2006-11-10  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * gcc.dg/torture/builtin-symmetric-1.c: New test.
+
 2006-11-10 Paul Thomas <pault@gcc.gnu.org>
 
    PR fortran/29758
diff --git a/gcc/testsuite/gcc.dg/torture/builtin-symmetric-1.c b/gcc/testsuite/gcc.dg/torture/builtin-symmetric-1.c
new file mode 100644 (file)
index 0000000..49be06f
--- /dev/null
@@ -0,0 +1,54 @@
+/* Copyright (C) 2006  Free Software Foundation.
+
+   Verify that built-in math function folding of symmetric even and
+   odd functions is correctly performed by the compiler.
+
+   Origin: Kaveh R. Ghazi,  November 09, 2006.  */
+
+/* { dg-do link } */
+/* { dg-options "-ffast-math" } */
+
+/* All references to link_error should go away at compile-time.  */
+extern void link_error(int);
+
+/* Test that FUNC(-ARG) == FUNC(ARG).  */
+#define TESTIT_EVEN(FUNC) do { \
+  if (__builtin_##FUNC##f(-xf) != __builtin_##FUNC##f(xf)) \
+    link_error(__LINE__); \
+  if (__builtin_##FUNC(-x) != __builtin_##FUNC(x)) \
+    link_error(__LINE__); \
+  if (__builtin_##FUNC##l(-xl) != __builtin_##FUNC##l(xl)) \
+    link_error(__LINE__); \
+  } while (0)
+
+/* Test that -FUNC(ARG) == FUNC(-ARG).  */
+#define TESTIT_ODD(FUNC) do { \
+  if (-__builtin_##FUNC##f(-xf) != __builtin_##FUNC##f(xf)) \
+    link_error(__LINE__); \
+  if (-__builtin_##FUNC(-x) != __builtin_##FUNC(x)) \
+    link_error(__LINE__); \
+  if (-__builtin_##FUNC##l(-xl) != __builtin_##FUNC##l(xl)) \
+    link_error(__LINE__); \
+  } while (0)
+
+void foo (float xf, double x, long double xl)
+{
+  TESTIT_EVEN(cos);
+
+  TESTIT_ODD(asin);
+  TESTIT_ODD(asinh);
+  TESTIT_ODD(atan);
+  TESTIT_ODD(atanh);
+  TESTIT_ODD(cbrt);
+  TESTIT_ODD(sin);
+  TESTIT_ODD(sinh);
+  TESTIT_ODD(tan);
+  TESTIT_ODD(tanh);
+  TESTIT_ODD(erf);
+}
+
+int main()
+{
+  foo (1,1,1);
+  return 0;
+}