diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c73e18145b2..8d739235241 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-04-19 Roger Sayle + + * builtins.c (expand_builtin): Don't expand a pure or const + built-in function if the result will be ignored and none of + its arguments are volatile. + 2003-04-19 Kean Johnston * unwind-dw2.c (_Unwind_GetCFA): cast return to avoid warning diff --git a/gcc/builtins.c b/gcc/builtins.c index 89f9531c8d3..87437d0e657 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -4139,6 +4139,36 @@ expand_builtin (exp, target, subtarget, mode, ignore) break; } + /* The built-in function expanders test for target == const0_rtx + to determine whether the function's result will be ignored. */ + if (ignore) + target = const0_rtx; + + /* If the result of a pure or const built-in function is ignored, and + none of its arguments are volatile, we can avoid expanding the + built-in call and just evaluate the arguments for side-effects. */ + if (target == const0_rtx + && (DECL_IS_PURE (fndecl) || TREE_READONLY (fndecl))) + { + bool volatilep = false; + tree arg; + + for (arg = arglist; arg; arg = TREE_CHAIN (arg)) + if (TREE_THIS_VOLATILE (TREE_VALUE (arg))) + { + volatilep = true; + break; + } + + if (! volatilep) + { + for (arg = arglist; arg; arg = TREE_CHAIN (arg)) + expand_expr (TREE_VALUE (arg), const0_rtx, + VOIDmode, EXPAND_NORMAL); + return const0_rtx; + } + } + switch (fcode) { case BUILT_IN_ABS: