aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2007-08-22 11:43:32 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2007-08-22 11:43:32 +0000
commit968fc3b64fd72e5ebab888ca442a007efc1dc1b4 (patch)
treef54588d06d55df4ab4c422240ba545ab8e292eed /gcc
parent3fe42b898a374eeef732567f0b50168a4a1e3ccc (diff)
downloadgcc-968fc3b64fd72e5ebab888ca442a007efc1dc1b4.zip
gcc-968fc3b64fd72e5ebab888ca442a007efc1dc1b4.tar.gz
gcc-968fc3b64fd72e5ebab888ca442a007efc1dc1b4.tar.bz2
re PR middle-end/33007 (builtin lround doesn't work)
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. * gcc.dg/pr33007.c: New testcase. From-SVN: r127701
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/builtins.c18
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr33007.c10
4 files changed, 26 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fd50152..1280151 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/builtins.c b/gcc/builtins.c
index cbe00c7..64f8185 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c77dec9..189097d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..b1fc428
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr33007.c
@@ -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);
+}