UPDATE: The df_analyze_loop is calling the df_set_blocks. Thus, the analysis behaves as if the function only contains those blocks and any edges that occur directly between the blocks in the set (see df-core.cc). This said, the loop-doloop behaves faulty at loop-doloop.cc:772 as the df_get_lives_out (loop_end) is not computed correctly.
A possible solution is to include in the blocks_to_analyze the missing basic blocks, something like: diff --git a/gcc/df-core.cc b/gcc/df-core.cc index a901b84878f..d7059c188b2 100644 --- a/gcc/df-core.cc +++ b/gcc/df-core.cc @@ -1437,7 +1437,15 @@ df_analyze_loop (class loop *loop) df_set_blocks (blocks); BITMAP_FREE (blocks); - df_analyze_1 (); + /* Add the loop's header successor bbs too. */ + edge e; + edge_iterator ei; + FOR_EACH_EDGE (e, ei, loop->header->succs) + bitmap_set_bit (df->blocks_to_analyze, e->dest->index); + + if (dump_file) + debug_bitmap_file (dump_file, df->blocks_to_analyze); + df_analyze (); } What do you think, Claudiu On Tue, Dec 13, 2022 at 2:30 PM Claudiu Zissulescu Ianculescu <claz...@gmail.com> wrote: > > It looks like that. The df_analyze_loop is only looking at the loop > BBs, and it is not clear for me if df_analyze_loop is required to have > all the df_live_outs correctly computed or not. Do you know if it is > true? > > If the df_analyze_loop is not supposed to compute all the df_live_outs > correctly, then the error resides in how loop-doloop is using the > iv_analysis_loop_init(). > > Thank you for your help, > Claudiu > > On Tue, Dec 13, 2022 at 10:41 AM Eric Botcazou <botca...@adacore.com> wrote: > > > > > The problem shows in loop-doloop.c when I introduce a loop end pattern > > > that replaces the first jump instruction (JUMP_INSN 15) with a pattern > > > that clobbers CC reg. However, the DF doesn't look like it works as > > > the doloop step cannot find the CC reg alive. Please see > > > loop-doloop.c:766. Hence, it introduces the doloop_end patterns, and > > > renders the compare instruction (INSN 14) dead code. leading to > > > errors. > > > > So df_get_live_out does not contain the CC register? iv_analysis_loop_init > > only performs a local update of the DF information, maybe it does not cover > > the basic block containing insn 14 and 15? > > > > -- > > Eric Botcazou > > > >