From fe27b7cc414a7b57ef801872157b596f4f39c1f6 Mon Sep 17 00:00:00 2001
From: "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>
Date: Thu, 11 Sep 2003 22:51:20 +0000
Subject: [PATCH] builtins.c (fold_builtin_logarithm): if N can't be truncated
 to MODE exactly...

	* builtins.c (fold_builtin_logarithm): if N can't be truncated to
	MODE exactly, then only convert logN(N) -> 1.0 if
	flag_unsafe_math_optimizations is set.

From-SVN: r71322
---
 gcc/ChangeLog  |  4 ++++
 gcc/builtins.c | 15 ++++++++++-----
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d6d762417e8a..df66b3e2640b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
 2003-09-11  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
+	* builtins.c (fold_builtin_logarithm): if N can't be truncated to
+	MODE exactly, then only convert logN(N) -> 1.0 if
+	flag_unsafe_math_optimizations is set.
+
 	* builtins.c (builtin_dconsts_init, dconstpi, dconste,
 	init_builtin_dconsts): Delete.
 	* emit-rtl.c (dconstpi, dconste): Define.
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 4df0e95b7f6a..2e8189d106cd 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -5949,16 +5949,21 @@ fold_builtin_logarithm (tree exp, const REAL_VALUE_TYPE *value)
       tree type = TREE_TYPE (TREE_TYPE (fndecl));
       tree arg = TREE_VALUE (arglist);
       const enum built_in_function fcode = builtin_mathfn_code (arg);
-      const REAL_VALUE_TYPE value_mode =
-	real_value_truncate (TYPE_MODE (type), *value);
 	
       /* Optimize log*(1.0) = 0.0.  */
       if (real_onep (arg))
 	return build_real (type, dconst0);
 
-      /* Optimize logN(N) = 1.0.  */
-      if (real_dconstp (arg, &value_mode))
-	return build_real (type, dconst1);
+      /* Optimize logN(N) = 1.0.  If N can't be truncated to MODE
+         exactly, then only do this if flag_unsafe_math_optimizations.  */
+      if (exact_real_truncate (TYPE_MODE (type), value)
+	  || flag_unsafe_math_optimizations)
+        {
+	  const REAL_VALUE_TYPE value_truncate =
+	    real_value_truncate (TYPE_MODE (type), *value);
+	  if (real_dconstp (arg, &value_truncate))
+	    return build_real (type, dconst1);
+	}
       
       /* Special case, optimize logN(expN(x)) = x.  */
       if (flag_unsafe_math_optimizations
-- 
GitLab