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