builtins.c (expand_builtin): Don't expand a pure or const built-in function if...
authorRoger Sayle <roger@eyesopen.com>
Sun, 20 Apr 2003 03:11:14 +0000 (03:11 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sun, 20 Apr 2003 03:11:14 +0000 (03:11 +0000)
* 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.

From-SVN: r65843

gcc/ChangeLog
gcc/builtins.c

index c73e181..8d73923 100644 (file)
@@ -1,3 +1,9 @@
+2003-04-19  Roger Sayle  <roger@eyesopen.com>
+
+       * 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  <jkj@sco.com>
 
        * unwind-dw2.c (_Unwind_GetCFA): cast return to avoid warning
index 89f9531..87437d0 100644 (file)
@@ -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: