From 5a626f11f4069f2b9d8f16ca9d8c210a5458cd6c Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 15 Dec 1999 20:56:58 +0000 Subject: [PATCH] builtins.c (expand_builtin_mathfn): Make sure not to expand the argument more than once. * builtins.c (expand_builtin_mathfn): Make sure not to expand the argument more than once. From-SVN: r30963 --- gcc/ChangeLog | 5 +++++ gcc/builtins.c | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e8cfed..0462e45 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +1999-12-15 Mark Mitchell + + * builtins.c (expand_builtin_mathfn): Make sure not to expand the + argument more than once. + 1999-12-15 Jason Merrill * stmt.c (expand_decl): Expand upper bound of a dynamic array. diff --git a/gcc/builtins.c b/gcc/builtins.c index ffc84fd..f03a53f 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1182,9 +1182,16 @@ expand_builtin_mathfn (exp, target, subtarget) && TREE_CODE (TREE_VALUE (arglist)) != PARM_DECL) { exp = copy_node (exp); - arglist = copy_node (arglist); TREE_OPERAND (exp, 1) = arglist; + /* Wrap the computation of the argument in a SAVE_EXPR. That + way, if we need to expand the argument again (as in the + flag_errno_math case below where we cannot directly set + errno), we will not perform side-effects more than once. + Note that here we're mutating the original EXP as well as the + copy; that's the right thing to do in case the original EXP + is expanded later. */ TREE_VALUE (arglist) = save_expr (TREE_VALUE (arglist)); + arglist = copy_node (arglist); } op0 = expand_expr (TREE_VALUE (arglist), subtarget, VOIDmode, 0); -- 2.7.4