2007-08-22 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Aug 2007 11:43:32 +0000 (11:43 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Aug 2007 11:43:32 +0000 (11:43 +0000)
PR middle-end/33007
* builtins.c (expand_builtin_int_roundingfn): Replace call
argument wrapped with SAVE_EXPR directly.
(expand_builtin_int_roundingfn_2): Likewise.

* gcc.dg/pr33007.c: New testcase.

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

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr33007.c [new file with mode: 0644]

index fd50152..1280151 100644 (file)
@@ -1,5 +1,12 @@
 2007-08-22  Richard Guenther  <rguenther@suse.de>
 
+       PR middle-end/33007
+       * builtins.c (expand_builtin_int_roundingfn): Replace call
+       argument wrapped with SAVE_EXPR directly.
+       (expand_builtin_int_roundingfn_2): Likewise.
+
+2007-08-22  Richard Guenther  <rguenther@suse.de>
+
        * tree-inline.c (inlinable_function_p): Restore disregarding
        inline limits for GNU extern inline functions.
 
index cbe00c7..64f8185 100644 (file)
@@ -2516,7 +2516,7 @@ expand_builtin_int_roundingfn (tree exp, rtx target, rtx subtarget)
   enum built_in_function fallback_fn;
   tree fallback_fndecl;
   enum machine_mode mode;
-  tree arg, narg;
+  tree arg;
 
   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
     gcc_unreachable ();
@@ -2549,12 +2549,7 @@ expand_builtin_int_roundingfn (tree exp, rtx target, rtx subtarget)
   /* Wrap the computation of the argument in a SAVE_EXPR, as we may
      need to expand the argument again.  This way, we will not perform
      side-effects more the once.  */
-  narg = builtin_save_expr (arg);
-  if (narg != arg)
-    {
-      arg = narg;
-      exp = build_call_expr (fndecl, 1, arg);
-    }
+  CALL_EXPR_ARG (exp, 0) = builtin_save_expr (arg);
 
   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
 
@@ -2646,7 +2641,7 @@ expand_builtin_int_roundingfn_2 (tree exp, rtx target, rtx subtarget)
   convert_optab builtin_optab;
   rtx op0, insns;
   tree fndecl = get_callee_fndecl (exp);
-  tree arg, narg;
+  tree arg;
   enum machine_mode mode;
 
   /* There's no easy way to detect the case we need to set EDOM.  */
@@ -2678,12 +2673,7 @@ expand_builtin_int_roundingfn_2 (tree exp, rtx target, rtx subtarget)
   /* Wrap the computation of the argument in a SAVE_EXPR, as we may
      need to expand the argument again.  This way, we will not perform
      side-effects more the once.  */
-  narg = builtin_save_expr (arg);
-  if (narg != arg)
-    {
-      arg = narg;
-      exp = build_call_expr (fndecl, 1, arg);
-    }
+  CALL_EXPR_ARG (exp, 0) = builtin_save_expr (arg);
 
   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
 
index c77dec9..189097d 100644 (file)
@@ -1,3 +1,8 @@
+2007-08-22  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/33007
+       * gcc.dg/pr33007.c: New testcase.
+
 2007-08-22  Richard Sandiford  <richard@codesourcery.com>
 
        * gcc.c-torture/execute/strcmp-1.x: Delete.
diff --git a/gcc/testsuite/gcc.dg/pr33007.c b/gcc/testsuite/gcc.dg/pr33007.c
new file mode 100644 (file)
index 0000000..b1fc428
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O -ffast-math -ftrapping-math" } */
+
+long
+foo (int i)
+{
+  float x;
+  x = i;
+  return __builtin_lroundf (x);
+}