Hi!

__builtin_apply calls some other function, so whether it is const, pure or
none of that, whether it can throw or not etc. depends on whether that
called function is const or pure or none of that, whether it can throw etc.
So, assuming __builtin_apply is const is wrong.  The following patch
looks larger due to reformatting, but basically took the case BUILT_IN_APPLY:
line out.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

If we really cared that much about a builtin almost nobody uses, we could
analyze the called function, but this stuff is called from two different
spots and I think from the other one the arguments of the __builtin_apply
call aren't available.

2019-12-14  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/92930
        * ipa-pure-const.c (special_builtin_state): Don't handle
        BUILT_IN_APPLY.  Formatting fixes.
        (check_call): Formatting fixes.

        * gcc.dg/tree-ssa/pr92930.c: New test.

--- gcc/ipa-pure-const.c.jj     2019-10-30 10:49:35.075045961 +0100
+++ gcc/ipa-pure-const.c        2019-12-13 18:52:53.822632062 +0100
@@ -511,35 +511,34 @@ worse_state (enum pure_const_state_e *st
    but function using them is.  */
 static bool
 special_builtin_state (enum pure_const_state_e *state, bool *looping,
-                       tree callee)
+                      tree callee)
 {
   if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
     switch (DECL_FUNCTION_CODE (callee))
       {
-       case BUILT_IN_RETURN:
-       case BUILT_IN_UNREACHABLE:
-       CASE_BUILT_IN_ALLOCA:
-       case BUILT_IN_STACK_SAVE:
-       case BUILT_IN_STACK_RESTORE:
-       case BUILT_IN_EH_POINTER:
-       case BUILT_IN_EH_FILTER:
-       case BUILT_IN_UNWIND_RESUME:
-       case BUILT_IN_CXA_END_CLEANUP:
-       case BUILT_IN_EH_COPY_VALUES:
-       case BUILT_IN_FRAME_ADDRESS:
-       case BUILT_IN_APPLY:
-       case BUILT_IN_APPLY_ARGS:
-       case BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT:
-       case BUILT_IN_ASAN_AFTER_DYNAMIC_INIT:
-         *looping = false;
-         *state = IPA_CONST;
-         return true;
-       case BUILT_IN_PREFETCH:
-         *looping = true;
-         *state = IPA_CONST;
-         return true;
-       default:
-         break;
+      case BUILT_IN_RETURN:
+      case BUILT_IN_UNREACHABLE:
+      CASE_BUILT_IN_ALLOCA:
+      case BUILT_IN_STACK_SAVE:
+      case BUILT_IN_STACK_RESTORE:
+      case BUILT_IN_EH_POINTER:
+      case BUILT_IN_EH_FILTER:
+      case BUILT_IN_UNWIND_RESUME:
+      case BUILT_IN_CXA_END_CLEANUP:
+      case BUILT_IN_EH_COPY_VALUES:
+      case BUILT_IN_FRAME_ADDRESS:
+      case BUILT_IN_APPLY_ARGS:
+      case BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT:
+      case BUILT_IN_ASAN_AFTER_DYNAMIC_INIT:
+       *looping = false;
+       *state = IPA_CONST;
+       return true;
+      case BUILT_IN_PREFETCH:
+       *looping = true;
+       *state = IPA_CONST;
+       return true;
+      default:
+       break;
       }
   return false;
 }
@@ -624,9 +623,10 @@ check_call (funct_state local, gcall *ca
          case BUILT_IN_LONGJMP:
          case BUILT_IN_NONLOCAL_GOTO:
            if (dump_file)
-             fprintf (dump_file, "    longjmp and nonlocal goto is not 
const/pure\n");
+             fprintf (dump_file,
+                      "    longjmp and nonlocal goto is not const/pure\n");
            local->pure_const_state = IPA_NEITHER;
-            local->looping = true;
+           local->looping = true;
            break;
          default:
            break;
@@ -1532,7 +1532,7 @@ propagate_pure_const (void)
                    }
                }
              else if (special_builtin_state (&edge_state, &edge_looping,
-                                              y->decl))
+                                             y->decl))
                ;
              else
                state_from_flags (&edge_state, &edge_looping,
--- gcc/testsuite/gcc.dg/tree-ssa/pr92930.c.jj  2019-12-13 18:59:19.651732842 
+0100
+++ gcc/testsuite/gcc.dg/tree-ssa/pr92930.c     2019-12-13 19:00:34.829582072 
+0100
@@ -0,0 +1,19 @@
+/* PR tree-optimization/92930 */
+/* { dg-do compile { target untyped_assembly } } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump "__builtin_apply " "optimized" } } */
+/* { dg-final { scan-tree-dump "__builtin_apply_args" "optimized" } } */
+
+void foo (int a, int b, int c, int d, int e, int f, int g);
+
+static void bar (int a, ...)
+{
+  __builtin_apply (foo, __builtin_apply_args (), 20);
+}
+
+int
+main ()
+{
+  bar (1024, 1025, 1026, 1027, 1028, 1029, 1030);
+  return 0;
+}

        Jakub

Reply via email to