From: Jakub Jelinek Date: Sat, 14 Dec 2019 11:18:30 +0000 (+0100) Subject: re PR tree-optimization/92930 (GCC incorrectly optimizes away __builtin_apply() calls) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=813b70a17b0cf8056b3005c3cdb882d522e02d84;p=gcc.git re PR tree-optimization/92930 (GCC incorrectly optimizes away __builtin_apply() calls) 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. From-SVN: r279394 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b50155dde0c..e0ac204d0e3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-12-14 Jakub Jelinek + + PR tree-optimization/92930 + * ipa-pure-const.c (special_builtin_state): Don't handle + BUILT_IN_APPLY. Formatting fixes. + (check_call): Formatting fixes. + 2019-12-14 Iain Sandoe * config/darwin.h (DARWIN_EXTRA_SPECS): Add new diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index a142e0cc8f6..58ab668009a 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -511,35 +511,34 @@ worse_state (enum pure_const_state_e *state, bool *looping, 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 *call, bool ipa) 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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e182244b208..da0d3abe350 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-12-14 Jakub Jelinek + + PR tree-optimization/92930 + * gcc.dg/tree-ssa/pr92930.c: New test. + 2019-12-13 Martin Sebor PR middle-end/91582 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr92930.c b/gcc/testsuite/gcc.dg/tree-ssa/pr92930.c new file mode 100644 index 00000000000..67e604b6c50 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr92930.c @@ -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; +}