On Tue, Dec 13, 2011 at 3:04 AM, Hans-Peter Nilsson <hans-peter.nils...@axis.com> wrote: > > (Please don't forget to CC gcc-patches on replies. Thanks.) > > > From: Dmitriy Vyukov <dvyu...@google.com> > > Date: Mon, 12 Dec 2011 14:43:10 +0100 > > > Fix flags for edges from/to entry/exit basic blocks. > > W/o this patch I hit internal asserts when trying to > > split the edge from entry block. > > > > Index: gcc/cgraphunit.c > > =================================================================== > > --- gcc/cgraphunit.c (revision 182237) > > +++ gcc/cgraphunit.c (working copy) > > @@ -1459,8 +1459,8 @@ > > > > /* Create BB for body of the function and connect it properly. */ > > bb = create_basic_block (NULL, (void *) 0, ENTRY_BLOCK_PTR); > > - make_edge (ENTRY_BLOCK_PTR, bb, 0); > > - make_edge (bb, EXIT_BLOCK_PTR, 0); > > + make_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU); > > + make_edge (bb, EXIT_BLOCK_PTR, EDGE_FALLTHRU); > > > > return bb; > > } > > Index: gcc/ChangeLog > > =================================================================== > > --- gcc/ChangeLog (revision 182237) > > +++ gcc/ChangeLog (working copy) > > @@ -1,3 +1,8 @@ > > +2011-12-12 Dmitry Vyukov <dvyu...@google.com> > > + > > + * cgraphunit.c (init_lowered_empty_function): > > + Fix flags for new edges. > > + > > This caused a build failure for cris-elf (i.e. it is the most > likely patch in the breaking range r182243:182256): > > In member function 'void > std::istrstream::_ZTv0_n12_NSt10istrstreamD0Ev()': > /tmp/hpautotest-gcc1/cris-elf/gccobj/cris-elf/libstdc++-v3/include/backward/strstream:134:13: > error: fallthru to exit from bb 2 > /tmp/hpautotest-gcc1/cris-elf/gccobj/cris-elf/libstdc++-v3/include/backward/strstream:134:13: > error: fallthru edge after a control statement in bb 2 > /tmp/hpautotest-gcc1/cris-elf/gccobj/cris-elf/libstdc++-v3/include/backward/strstream:134:13: > error: wrong outgoing edge flags at end of bb 2 > /tmp/hpautotest-gcc1/cris-elf/gccobj/cris-elf/libstdc++-v3/include/backward/strstream:134:13: > internal compiler error: verify_flow_info failed > > Details in PR51521. >
Hi, Sorry for the trouble. What should I do now? Just in case I've prepared a patch that rolls it back: http://codereview.appspot.com/5485054 Since it has got the attention, I will describe my initial problem. I am testing ThreadSanitizer instrumentation pass for gcc. I've successfully compiled like a million LOCs, but then hit the following crash: In file included from foo.cc:4:0: foo.h: In member function 'bar': foo.h:92:34: internal compiler error: in gimple_redirect_edge_and_branch, at tree-cfg.c:5013 My instrumentation code that causes the crash is (split entry edge and add a new bb at func entry): static void instrument_func_entry (void) { gimple_seq seq; basic_block entry_bb; edge entry_edge; gimple_stmt_iterator gsi; /* Insert new BB before the first BB. */ seq = build_func_entry_instr (); gcc_assert (seq != NULL); entry_bb = ENTRY_BLOCK_PTR; entry_edge = single_succ_edge (entry_bb); set_location (seq, cfun->function_start_locus); entry_bb = split_edge (entry_edge); gsi = gsi_start_bb (entry_bb); gsi_insert_seq_after (&gsi, seq, GSI_NEW_STMT); } Full code is here: http://gcc.gnu.org/viewcvs/branches/google/main/gcc/tree-tsan.c?view=markup The pass is executed after pass_sink_code: NEXT_PASS (pass_split_crit_edges); NEXT_PASS (pass_pre); NEXT_PASS (pass_sink_code); NEXT_PASS (pass_asan); NEXT_PASS (pass_tsan); <---- HERE NEXT_PASS (pass_tree_loop); Here is the dump of the source function just before my pass: ;; Function foo(foo, funcdef_no=9728, decl_uid=156387, cgraph_uid=4074) ;; 1 loops found ;; ;; Loop 0 ;; header 0, latch 1 ;; depth 0, outer -1 ;; nodes: 0 1 2 5 3 4 ;; 2 succs { 3 5 } ;; 5 succs { 4 } ;; 3 succs { 4 } ;; 4 succs { 1 } T* Y::foo(int) (struct Y * const this, int fd) { struct Y * adjusted_this.1221; <bb 2>: retval.1220_6 = *.LTHUNK22 (this_3(D), fd_4(D)); if (retval.1220_6 != 0B) goto <bb 3> (<L0>); else goto <bb 5>; <bb 5>: goto <bb 4>; <L0>: adjusted_this.1221_8 = retval.1220_6 + 8; <bb 4>: # adjusted_this.1221_1 = PHI <adjusted_this.1221_8(3), 0B(5)> return adjusted_this.1221_1; } And here is the gdb session: Breakpoint 2, fancy_abort (file=0x10d53b0 "gcc/tree-cfg.c", line=5013, function=0x10d81a0 "gimple_redirect_edge_and_branch") at gcc/diagnostic.c:892 892 { (gdb) bt #0 fancy_abort (file=0x10d53b0 "gcc/tree-cfg.c", line=5013, function=0x10d81a0 "gimple_redirect_edge_and_branch") at gcc/diagnostic.c:892 #1 0x0000000000a3af8a in gimple_redirect_edge_and_branch (e=0x7ffff0b6d640, dest=0x7ffff09ee240) at gcc/tree-cfg.c:5013 #2 0x000000000074a47a in redirect_edge_and_branch (e=0x7ffff0b6d640, dest=<optimized out>) at gcc/cfghooks.c:323 #3 0x0000000000a2ae8d in gimple_split_edge (edge_in=0x7ffff0b6d640) at gcc/tree-cfg.c:2564 #4 0x000000000074a9d7 in split_edge (e=0x7ffff0b6d640) at gcc/cfghooks.c:550 #5 0x0000000000badc27 in instrument_func_entry () at gcc/tree-tsan.c:1020 #6 tsan_pass () at gcc/tree-tsan.c:1073 #7 0x0000000000981918 in execute_one_pass (pass=0x13f66c0) at gcc/passes.c:2082 #8 0x0000000000981c85 in execute_pass_list (pass=0x13f66c0) at gcc/passes.c:2137 #9 0x0000000000981c97 in execute_pass_list (pass=0x13f4bc0) at gcc/passes.c:2138 #10 0x0000000000a8a92e in tree_rest_of_compilation (fndecl=0x7ffff27d7f00) at gcc/tree-optimize.c:465 #11 0x0000000000767a96 in cgraph_expand_function (node=0x7ffff16625c8) at gcc/cgraphunit.c:1967 #12 0x0000000000767c4f in cgraph_process_new_functions () at gcc/cgraphunit.c:275 #13 0x0000000000769bea in cgraph_expand_all_functions () at gcc/cgraphunit.c:2029 #14 cgraph_optimize () at gcc/cgraphunit.c:2313 #15 0x0000000000769ffa in cgraph_finalize_compilation_unit () at gcc/cgraphunit.c:1342 #16 0x000000000059d143 in cp_write_global_declarations () at gcc/cp/decl2.c:4074 #17 0x0000000000a25c8b in compile_file () at gcc/toplev.c:593 #18 do_compile () at gcc/toplev.c:1953 #19 toplev_main (argc=145, argv=0x7fffffffd388) at gcc/toplev.c:2029 #20 0x00007ffff786ed5d in __libc_start_main () from /usr/grte/v2/lib64/libc.so.6 #21 0x00000000004c15ce in _start () at ../sysdeps/x86_64/elf/start.S:114 (gdb) up #1 0x0000000000a3af8a in gimple_redirect_edge_and_branch (e=0x7ffff0b6d640, dest=0x7ffff09ee240) at gcc/tree-cfg.c:5013 5013 gcc_assert (e->flags & EDGE_FALLTHRU); (gdb) print *e $15 = {src = 0x7ffff0b1f8a0, dest = 0x7ffff0b1f960, insns = {g = 0x0, r = 0x0}, aux = 0x0, goto_block = 0x0, goto_locus = 0, dest_idx = 0, flags = 4096, probability = 0, count = 0} (gdb) print *e->src $16 = {preds = 0x0, succs = 0x7ffff0b6b6e0, aux = 0x0, loop_father = 0x0, dom = {0x1980cb0, 0x0}, prev_bb = 0x0, next_bb = 0x7ffff09ee240, il = {gimple = 0x0, rtl = 0x0}, count = 0, index = 0, loop_depth = 0, frequency = 0, flags = 0} (gdb) print *e->src->succs $4 = {base = {prefix = {num = 1, alloc = 4}, vec = {0x7ffff0b6d640}}} (gdb) print *e->dest $17 = {preds = 0x7ffff0b6b708, succs = 0x7ffff0b6b730, aux = 0x0, loop_father = 0x0, dom = {0x1980a70, 0x0}, prev_bb = 0x7ffff09ee240, next_bb = 0x7ffff09ee1e0, il = {gimple = 0x7ffff0b1e9f0, rtl = 0x7ffff0b1e9f0}, count = 0, index = 2, loop_depth = 0, frequency = 0, flags = 3} The assert that fails is: 5013 gcc_assert (e->flags & EDGE_FALLTHRU); e->flags = 4096 which is #define EDGE_EXECUTABLE 0x1000 /* Edge is executable. Only valid during SSA-CCP. */ So what does EDGE_FALLTHRU mean? Is it just a non-conditional edge? If so, the edges that I marked as EDGE_FALLTHRU look like they are indeed fallthru. Does that mean that the regressions are caused by other issues? If the edges must not be marked as EDGE_FALLTHRU, then how to fix the failing assert? I am not sure as to whether it is related or not, but on the very same source function I got another error (after successfully compiling like a million LOCs): foo.h: In member function 'T* Y::foo(int)': foo.h:92:34: internal compiler error: in verify_curr_properties, at passes.c:1816 Initially I've specified for my pass that it requires PROP_trees, but it turned out that PROP_gimple_lomp is not calculated. For now I've just replaced PROP_trees with PROP_ssa. However I think that all passes in the middle of the middle-end assume that OpenMP is already lowered. Does it mean that some passes were not executed for the source function?..