(I've sent this first to gcc-patches accidently :( > Kenny thought it would be nice, rather than pass the actual bb info to free > to the freeing function, to instead pass some random bitmap. > > > The attached fixes *that*, but this just causes a crash deeper in trying to > free some chains. > > However, it looks like that is either caused by a double free, or because > we never null out pointers to things after we free the memory for what they > are pointing to. > Here is a reduced testcase failing with -O1:
__udivmodti4 () { unsigned long d0, a; for (a = 56; a > 0; a -= 8) if ((d0 & 0xff) != 0) break; for (a = 57; a > 0; a -= 7) if ((d0 & 0xff) != 0) break; } With your patch: Program received signal SIGSEGV, Segmentation fault. 0x0000000080188d16 in bitmap_obstack_free (map=0x808dea80) at /build/gcc-4.2/gcc/bitmap.c:272 272 map->first = (void *)map->obstack->heads; (gdb) bt #0 0x0000000080188d16 in bitmap_obstack_free (map=0x808dea80) at /build/gcc-4.2/gcc/bitmap.c:272 #1 0x00000000802319fc in df_rd_free (dflow=0x808c9eb0) at /build/gcc-4.2/gcc/df-problems.c:1191 #2 0x000000008022a2b6 in df_finish1 (df=0x808d7db0) at /build/gcc-4.2/gcc/df-core.c:406 #3 0x00000000802914be in iv_analysis_done () at /build/gcc-4.2/gcc/loop-iv.c:1238 #4 0x00000000803d4a42 in estimate_probability (loops_info=0x3ffffcd9ce0) at /build/gcc-4.2/gcc/predict.c:844 #5 0x00000000803e699c in rest_of_handle_branch_prob () at /build/gcc-4.2/gcc/profile.c:1363 Without your patch: Program received signal SIGSEGV, Segmentation fault. 0x0000000080188d16 in bitmap_obstack_free (map=0x808ca708) at /build/gcc-4.2/gcc/bitmap.c:272 272 map->first = (void *)map->obstack->heads; (gdb) bt #0 0x0000000080188d16 in bitmap_obstack_free (map=0x808ca708) at /build/gcc-4.2/gcc/bitmap.c:272 #1 0x00000000802307b0 in df_rd_free_bb_info (dflow=0x808c9eb0, bb=0x2000001ad80, vbb_info=0x808ca660) at /build/gcc-4.2/gcc/df-problems.c:853 #2 0x0000000080229cd6 in df_set_blocks (df=0x808d7db0, blocks=0x808ca5a0) at /build/gcc-4.2/gcc/df-core.c:373 #3 0x000000008028e2ac in iv_analysis_loop_init (loop=0x808d7ca0) at /build/gcc-4.2/gcc/loop-iv.c:267 #4 0x00000000803d3efa in predict_loops (loops_info=0x3ffff889ce0, rtlsimpleloops=1 '\001') at /build/gcc-4.2/gcc/predict.c:618 #5 0x00000000803d4a24 in estimate_probability (loops_info=0x3ffff889ce0) at /build/gcc-4.2/gcc/predict.c:842 #6 0x00000000803e6984 in rest_of_handle_branch_prob () at /build/gcc-4.2/gcc/profile.c:1363 Bye, -Andreas- > Index: df-core.c > =================================================================== > --- df-core.c (revision 110017) > +++ df-core.c (working copy) > @@ -292,6 +292,7 @@ are write-only operations. > static struct df *ddf = NULL; > struct df *shared_df = NULL; > > +static void * df_get_bb_info (struct dataflow *, unsigned int); > > /*---------------------------------------------------------------------------- > Functions to create, destroy and manipulate an instance of df. > > ----------------------------------------------------------------------------*/ > @@ -370,7 +371,7 @@ df_set_blocks (struct df *df, bitmap blo > EXECUTE_IF_SET_IN_BITMAP (diff, 0, bb_index, bi) > { > basic_block bb = BASIC_BLOCK (bb_index); > - (*dflow->problem->free_bb_fun) (dflow, bb, diff); > + (*dflow->problem->free_bb_fun) (dflow, bb, df_get_bb_info > (dflow, bb_index)); > } > } > }