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

Reply via email to