From: sayle Date: Sun, 20 Apr 2003 03:11:14 +0000 (+0000) Subject: * builtins.c (expand_builtin): Don't expand a pure or const X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8d6d7930ebb0b4a3a39a502fdbca5842d1f226a4;p=thirdparty%2Fgcc.git * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65843 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c73e18145b23..8d7392352413 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 89f9531c8d3c..87437d0e657f 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: