* fold-const.c (negate_mathfn_p): Add BUILT_IN_ERF.
authorghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 11 Nov 2006 04:01:42 +0000 (04:01 +0000)
committerghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 11 Nov 2006 04:01:42 +0000 (04:01 +0000)
testsuite:
* gcc.dg/torture/builtin-symmetric-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118682 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 7f38662..a4c8553 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 6016a70..fedc3ca 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 3880cb9..7566130 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;
+}