diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7f38662fced496a876ce71f485ec0379a1f0fea6..a4c855391a8762cb4d8ccc7372d69b17a753ea72 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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)
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 6016a702d69c240a45a9be296d24e20178f93542..fedc3cad7e627489f6d142868ed21fe3dd58e9f5 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3880cb9f224868c3a08350edcaff8cd633f7cb2e..7566130247f3acba58fe816fbd472901a6c4449c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000000000000000000000000000000000000..49be06f8f846fd363289e5a285f34ada93a0e777
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/builtin-symmetric-1.c
@@ -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;
+}