From: Jeff Law Date: Tue, 1 Mar 2016 23:12:10 +0000 (-0700) Subject: re PR tree-optimization/69196 (code size regression with jump threading at -O2) X-Git-Tag: basepoints/gcc-7~655 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eab2541b860c48203115ac6dca3284e982015d2c;p=thirdparty%2Fgcc.git re PR tree-optimization/69196 (code size regression with jump threading at -O2) PR tree-optimization/69196 * tree-ssa-threadbackward.c (fsm_find_control_statement_thread_paths): Appropriately clamp the number of statements to copy when the thread path does not traverse a loop backedge. PR tree-optimization/69196 * gcc.dg/tree-ssa/pr69196.c: New test. From-SVN: r233870 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 982a7c05284a..88f0806ac52e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -6,6 +6,11 @@ 2016-03-01 Jeff Law + PR tree-optimization/69196 + * tree-ssa-threadbackward.c (fsm_find_control_statement_thread_paths): + Appropriately clamp the number of statements to copy when the + thread path does not traverse a loop backedge. + PR tree-optimization/69196 * tree-ssa-threadbackward.c (fsm_find_control_statement_thread_paths): Do count some PHIs in the thread path against the insn count. Decrease diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bdc4b1166e6d..1e6a8500c512 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -4,6 +4,9 @@ 2016-03-01 Jeff Law + PR tree-optimization/69196 + * gcc.dg/tree-ssa/pr69196.c: New test. + PR tree-optimization/69196 * gcc.dg/tree-ssa/vrp46.c: Twiddle threading params to keep it from duplicating code and spoiling the expected output. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr69196-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr69196-1.c new file mode 100644 index 000000000000..11c7cf5698d6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr69196-1.c @@ -0,0 +1,138 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp1-details" } */ + +/* { dg-final { scan-tree-dump "FSM did not thread around loop and would copy too many statements" "vrp1" } } */ + + +typedef __builtin_va_list __gnuc_va_list; +typedef __gnuc_va_list va_list; +extern void rtems_putc(char c); + +void vprintk( + const char *fmt, + va_list ap +) +{ + for (; *fmt != '\0'; fmt++) { + unsigned base = 0; + unsigned width = 0; + enum { + LFLAG_INT, + LFLAG_LONG, + LFLAG_LONG_LONG + } lflag = LFLAG_INT; + _Bool minus = 0; + _Bool sign = 0; + char lead = ' '; + char c = *fmt; + long long num; + + if (c != '%') { + rtems_putc(c); + continue; + } + + ++fmt; c = *fmt; + + if (c == '0') { + lead = '0'; + ++fmt; c = *fmt; + } + + if (c == '-') { + minus = 1; + ++fmt; c = *fmt; + } + + while (c >= '0' && c <= '9' ) { + width *= 10; + width += ((unsigned) c - '0'); + ++fmt; c = *fmt; + } + + if (c == 'l') { + lflag = LFLAG_LONG; + ++fmt; c = *fmt; + + if (c == 'l') { + lflag = LFLAG_LONG_LONG; + ++fmt; c = *fmt; + } + } + + if ( c == 'c' ) { + + char chr = (char) __builtin_va_arg(ap,int); + rtems_putc(chr); + continue; + } + + if ( c == 's' ) { + unsigned i, len; + char *s, *str; + + str = __builtin_va_arg(ap,char *); + + if ( str == ((void *)0) ) { + str = ""; + } + + + for ( len=0, s=str ; *s ; len++, s++ ) + ; + + + if ( !minus ) + for ( i=len ; i= PARAM_VALUE (PARAM_MAX_JUMP_THREAD_DUPLICATION_STMTS))) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + "FSM did not thread around loop and would copy too " + "many statements.\n"); + path->pop (); + continue; + } + /* When there is a multi-way branch on the path, then threading can explode the CFG due to duplicating the edges for that multi-way branch. So like above, only allow a multi-way branch on the path