https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61776

            Bug ID: 61776
           Summary: ICE: verify_flow_info failed: control flow in the
                    middle of basic block with -fprofile-generate
           Product: gcc
           Version: 4.10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: wmi at google dot com
                CC: rguenth at gcc dot gnu.org
              Host: x86_64-linux-gnu
            Target: x86_64-linux-gnu
             Build: x86_64-linux-gnu

Created attachment 33106
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33106&action=edit
testcase 1.c

~/workarea/gcc-r211604/build/install/bin/gcc -O2 -S -fprofile-generate 1.c

1.c: In function ‘foo’:
1.c:24:1: error: control flow in the middle of basic block 3
 }
 ^
1.c:24:1: error: control flow in the middle of basic block 3
1.c:24:1: error: control flow in the middle of basic block 3
1.c:24:1: internal compiler error: verify_flow_info failed
0x71f8c2 verify_flow_info()
       ../../src/gcc/cfghooks.c:260
0xbdaf1b cleanup_tree_cfg_noloop
       ../../src/gcc/tree-cfgcleanup.c:737
0xbdafec cleanup_tree_cfg()
       ../../src/gcc/tree-cfgcleanup.c:786
0xc674b8 tree_profiling
       ../../src/gcc/tree-profile.c:652
0xc6754a execute
       ../../src/gcc/tree-profile.c:691

The cause of the problem is:

Before edge profiling instrumentation, goo in 1.c is regarded as a const
function since it has no side-effect, so during instrumentation call goo is not
regarded as a bb ending stmt, and some instrumentation code is inserted after
call goo in the same BB -- call goo stmt is in the middle of a BB now.

After edge profiling instrumentation, goo body now contains instrumentation
code, and goo's const flag is reset to false because now it has side-effect.
Since then call goo is regarded as a bb ending stmt, which is inconsistent with
the fact that call goo is in the middle of a BB. verify_flow_info() after that
fails and Error message "control flow in the middle of basic block" is
reported.

Google ref b/15936428

Reply via email to