On December 14, 2019 9:21:21 AM GMT+01:00, Jakub Jelinek <ja...@redhat.com> 
wrote:
>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?

Ok. 

Richard. 

>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