Hi! The inliner doesn't want to fold statements immediately, but records them and then fold_marked_statements is meant to fold them when inlining is done.
On the following testcase it doesn't fold some of them though. The problem is that it wants to scan only newly added basic blocks (i.e. those created during the inlining), but the way it is written only works if there are no gaps in the basic_block vector. If there are, it can fold stmts only in some of the basic blocks or none of them. Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2018-12-13 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/88444 * tree-inline.c (fold_marked_statements): Iterate up to last_basic_block_for_fn rather than n_basic_blocks_for_fn. * gcc.dg/tree-ssa/pr88444.c: New test. --- gcc/tree-inline.c.jj 2018-12-07 00:23:15.745986912 +0100 +++ gcc/tree-inline.c 2018-12-13 13:04:30.407956734 +0100 @@ -4906,7 +4906,7 @@ gimple_expand_calls_inline (basic_block static void fold_marked_statements (int first, hash_set<gimple *> *statements) { - for (; first < n_basic_blocks_for_fn (cfun); first++) + for (; first < last_basic_block_for_fn (cfun); first++) if (BASIC_BLOCK_FOR_FN (cfun, first)) { gimple_stmt_iterator gsi; --- gcc/testsuite/gcc.dg/tree-ssa/pr88444.c.jj 2018-12-13 13:11:39.577990474 +0100 +++ gcc/testsuite/gcc.dg/tree-ssa/pr88444.c 2018-12-13 13:12:45.184925117 +0100 @@ -0,0 +1,6 @@ +/* PR tree-optimization/88444 */ +/* { dg-do compile } */ +/* { dg-options "-O1 -finline-functions -finline-small-functions -fdump-tree-fixup_cfg3" } */ +/* { dg-final { scan-tree-dump-not " = \\(long int\\) 0;" "fixup_cfg3" } } */ + +#include "../pr88444.c" Jakub