From 5a626f11f4069f2b9d8f16ca9d8c210a5458cd6c Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 15 Dec 1999 20:56:58 +0000 Subject: 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/builtins.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'gcc/builtins.c') 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); -- cgit v1.1