This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Dataflow bug [RE: Large number of fortran testsuite failures]


On 12 June 2007 13:13, Paul Richard Thomas wrote:

>> You will excuse me please if I cannot identify the patch that is
>> responsible - this sort of investigation is just a bit too tedious
>> under Cygwin.  I will make one further reversion this morning and will
>> report if I have bracketed the problem.
>> 
> 
> The problem is between r125620 and r125628 but is NOT, as I suspected,
> r125621. 
> 
> Is nobody else seeing it, or is it a Cygwin specific problem?


  Dunno, because I'm on cygwin too.  Stack gots messed up:

Program received signal SIGSEGV, Segmentation fault.
0x004ecbee in ix86_expand_prologue () at /gnu/gcc/gcc/gcc/df.h:973
973       if (index < df_live->block_info_size)
(gdb) bt
#0  0x004ecbee in ix86_expand_prologue () at /gnu/gcc/gcc/gcc/df.h:973
#1  0x0079a71f in gen_prologue ()
    at /gnu/gcc/gcc/gcc/config/i386/i386.md:14460
#2  0x0023c938 in ?? ()
#3  0x006174b6 in thread_prologue_and_epilogue_insns ()
    at /gnu/gcc/gcc/gcc/function.c:5060
#4  0x00000000 in ?? ()
(gdb)


  By breaking on thread_prologue_and_epilogue_insns, you can see the whole
thing before the segfault:

Breakpoint 1, thread_prologue_and_epilogue_insns ()
    at /gnu/gcc/gcc/gcc/function.c:5059
5059          start_sequence ();
(gdb) c
Continuing.

Breakpoint 1, thread_prologue_and_epilogue_insns ()
    at /gnu/gcc/gcc/gcc/function.c:5059
5059          start_sequence ();
(gdb) bt
#0  thread_prologue_and_epilogue_insns () at /gnu/gcc/gcc/gcc/function.c:5059
#1  0x006180d0 in rest_of_handle_thread_prologue_and_epilogue ()
    at /gnu/gcc/gcc/gcc/function.c:5485
#2  0x006a77ef in execute_one_pass (pass=0xa8d9b0)
    at /gnu/gcc/gcc/gcc/passes.c:1123
#3  0x006a79e7 in execute_pass_list (pass=0xa90e40)
    at /gnu/gcc/gcc/gcc/passes.c:1176
#4  0x006a79fa in execute_pass_list (pass=0xa8d930)
    at /gnu/gcc/gcc/gcc/passes.c:1177
#5  0x006a79fa in execute_pass_list (pass=0xa8d7e0)
    at /gnu/gcc/gcc/gcc/passes.c:1177
#6  0x006bdb9f in tree_rest_of_compilation (fndecl=0x7fe3bc00)
    at /gnu/gcc/gcc/gcc/tree-optimize.c:406
#7  0x006a9431 in cgraph_expand_function (node=0x7fe3bd00)
    at /gnu/gcc/gcc/gcc/cgraphunit.c:1073
#8  0x006aa710 in cgraph_assemble_pending_functions ()
    at /gnu/gcc/gcc/gcc/cgraphunit.c:436
#9  0x006aab95 in cgraph_finalize_function (decl=0x7fe3bc00, nested=0)
    at /gnu/gcc/gcc/gcc/cgraphunit.c:553
#10 0x004818d6 in gfc_generate_function_code (ns=0x1ab44a0)
    at /gnu/gcc/gcc/gcc/fortran/trans-decl.c:3285
#11 0x00443d23 in gfc_parse_file () at /gnu/gcc/gcc/gcc/fortran/parse.c:3272
#12 0x00464940 in gfc_be_parse_file (set_yydebug=0)
    at /gnu/gcc/gcc/gcc/fortran/f95-lang.c:301
#13 0x0050e5a5 in toplev_main (argc=15, argv=0x1a78f18)
    at /gnu/gcc/gcc/gcc/toplev.c:1051
#14 0x004a8cef in main (argc=2346392, argv=0x61006148)
    at /gnu/gcc/gcc/gcc/main.c:35


  From there we go to gen_prologue.  The stack isn't actually messed up, gdb
just seems to have trouble tracing back through a function derived from the md
file.  gen_prologue calls ix86_expand_prologue and I stepped through that for
a bit:


(gdb) s
ix86_expand_prologue () at /gnu/gcc/gcc/gcc/config/i386/i386.c:5974
5974      ix86_compute_frame_layout (&frame);
(gdb) bt
#0  ix86_expand_prologue () at /gnu/gcc/gcc/gcc/config/i386/i386.c:5974
#1  0x0079a71f in gen_prologue ()
    at /gnu/gcc/gcc/gcc/config/i386/i386.md:14460
#2  0x0023c938 in ?? ()
#3  0x006174b6 in thread_prologue_and_epilogue_insns ()
    at /gnu/gcc/gcc/gcc/function.c:5060
#4  0x00000000 in ?? ()
(gdb) n
5976      if (cfun->machine->force_align_arg_pointer)
(gdb) print cfun
$2 = (struct function *) 0x7ff60348
(gdb) print *cfun
$3 = {eh = 0x7ff404d0, expr = 0x7fe5ad80, emit = 0x7ff72820,
  varasm = 0x7ff115a8, cfg = 0x7fe5ab60, gimple_df = 0x0,
  x_current_loops = 0x0, value_histograms = 0x0, decl = 0x7fe3bc00,
  outer = 0x0, pops_args = 0, args_size = 8, pretend_args_size = 0,
  outgoing_args_size = 0, arg_offset_rtx = 0x7ff10250, args_info = {
    words = 2, nregs = 0, regno = 0, fastcall = 0, sse_words = 0,
    sse_nregs = 0, warn_sse = 1, warn_mmx = 1, sse_regno = 0, mmx_words = 0,
    mmx_nregs = 0, mmx_regno = 0, maybe_vaarg = 0, float_in_sse = 0},
  return_rtx = 0x0, internal_arg_pointer = 0x7ff20040,
  hard_reg_initial_vals = 0x0, x_nonlocal_goto_handler_labels = 0x0,
  x_return_label = 0x0, x_naked_return_label = 0x0,
  x_stack_slot_list = 0x7fe88b70, x_stack_check_probe_note = 0x0,
  x_arg_pointer_save_area = 0x0, x_frame_offset = -32352,
  static_chain_decl = 0x0, nonlocal_goto_save_area = 0x0,
  x_parm_birth_insn = 0x7fe5aee0, x_used_temp_slots = 0x7fe83bd0,
  x_avail_temp_slots = 0x0, fixup_var_refs_queue = 0x0,
  x_temp_slot_level = 0, inl_max_label_num = 0, funcdef_no = 3,
  machine = 0x7ff71740, stack_alignment_needed = 64,
  preferred_stack_boundary = 128, language = 0x0, used_types_hash = 0x0,
  epilogue_delay_list = 0x0, max_jumptable_ents = 0, last_label_uid = 8,
  function_end_locus = {
    file = 0x1a8dbc0 "/gnu/gcc/gcc/gcc/testsuite/gfortran.dg/sizeof.f90",
    line = 37}, unexpanded_var_list = 0x0, hot_section_label = 0x0,
  cold_section_label = 0x0, hot_section_end_label = 0x0,
  cold_section_end_label = 0x0, unlikely_text_section_name = 0x0,
  stack_protect_guard = 0x0, curr_properties = 264, last_verified = 8,
  va_list_gpr_size = 255, va_list_fpr_size = 255,
  function_frequency = FUNCTION_FREQUENCY_NORMAL, returns_struct = 0,
  returns_pcc_struct = 0, returns_pointer = 0, calls_setjmp = 0,
  calls_alloca = 0, accesses_prior_frames = 0, calls_eh_return = 0,
  has_nonlocal_label = 0, calls_unwind_init = 0, has_nonlocal_goto = 0,
  is_thunk = 0, all_throwers_are_sibcalls = 0, profile = 0, limit_stack = 0,
  stdarg = 0, x_dont_save_pending_sizes_p = 1, uses_const_pool = 0,
  uses_pic_offset_table = 0, uses_eh_lsda = 0,
  arg_pointer_save_area_init = 0, after_inlining = 1,
  recursive_call_emit = 0, tail_call_emit = 0, gimplified = 1}
(gdb) step
6025      if (frame_pointer_needed)
(gdb)
6027          insn = emit_insn (gen_push (hard_frame_pointer_rtx));
(gdb) n
6028          RTX_FRAME_RELATED_P (insn) = 1;
(gdb)
6030          insn = emit_move_insn (hard_frame_pointer_rtx,
stack_pointer_rtx);

(gdb)
6031          RTX_FRAME_RELATED_P (insn) = 1;
(gdb)
6036      if (!frame.save_regs_using_mov)
(gdb)
6034      allocate = frame.to_allocate;
(gdb)
6036      if (!frame.save_regs_using_mov)
(gdb)
5846        if (ix86_save_reg (regno, true))
(gdb)
5845      for (regno = FIRST_PSEUDO_REGISTER; regno-- > 0; )
(gdb)
5846        if (ix86_save_reg (regno, true))
(gdb)

  [ ... snip many loop iterations ... ]

5846        if (ix86_save_reg (regno, true))
(gdb)
5845      for (regno = FIRST_PSEUDO_REGISTER; regno-- > 0; )
(gdb)
6043      if (TARGET_RED_ZONE && frame.save_regs_using_mov)
(gdb)
6048      if (allocate == 0)
(gdb)
6050      else if (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)
(gdb)
6056          rtx eax = gen_rtx_REG (Pmode, 0);
(gdb)
973       if (index < df_live->block_info_size)
(gdb)
6056          rtx eax = gen_rtx_REG (Pmode, 0);
(gdb)
3018      return REGNO_REG_SET_P (DF_LIVE_OUT (ENTRY_BLOCK_PTR), 0);
(gdb)
973       if (index < df_live->block_info_size)
(gdb)

Program received signal SIGSEGV, Segmentation fault.
0x004ecbee in ix86_expand_prologue () at /gnu/gcc/gcc/gcc/df.h:973
973       if (index < df_live->block_info_size)
(gdb) thread 1
[Switching to thread 1 (thread 3316.0x25c)]#0  0x004ecbee in
ix86_expand_prologue () at /gnu/gcc/gcc/gcc/df.h:973
973       if (index < df_live->block_info_size)
(gdb) list
968     }
969
970     static inline struct df_live_bb_info *
971     df_live_get_bb_info (unsigned int index)
972     {
973       if (index < df_live->block_info_size)
974         return (struct df_live_bb_info *) df_live->block_info[index];
975       else
976         return NULL;
977     }
(gdb) info locals
eax = (rtx) 0x7fe8af20
t = (rtx) 0x0
insn = (rtx) 0x7e60
pic_reg_used = 0 '\0'
frame = {nregs = 2, padding1 = 0, va_arg_size = 0, frame = 2344936,
  padding2 = 0, outgoing_arguments_size = 0, red_zone_size = 0,
  to_allocate = 32352, frame_pointer_offset = 16,
  hard_frame_pointer_offset = 8, stack_pointer_offset = 32368,
  save_regs_using_mov = 0 '\0'}
allocate = 32352
__FUNCTION__ = "ix86_expand_prologue"
(gdb) print df
$4 = (struct df *) 0x1ab58b8
(gdb) print *df
$5 = {problems_in_order = {0x1adad68, 0x1ada980, 0x1ad6850, 0x0, 0x0, 0x0,
    0x0, 0x0}, problems_by_index = {0x1adad68, 0x1ada980, 0x0, 0x0, 0x0, 0x0,
    0x0, 0x1ad6850}, num_problems_defined = 3, blocks_to_analyze = 0x0,
  analyze_subset = 0 '\0', redo_entry_and_exit = 0 '\0', def_info = {
    refs = 0x0, begin = 0x1ab6108, count = 0x1ac15f8, refs_size = 0,
    table_size = 0, total_size = 317, ref_order = DF_REF_ORDER_NO_TABLE},
  use_info = {refs = 0x0, begin = 0x1ac1828, count = 0x1ac1a58,
    refs_size = 0, table_size = 0, total_size = 191,
    ref_order = DF_REF_ORDER_NO_TABLE}, def_regs = 0x1ab5a78,
  use_regs = 0x1ab5ca8, eq_use_regs = 0x1ab5ed8, regs_size = 138,
  regs_inited = 111, insns = 0x1ac1c88, insns_size = 212,
  hardware_regs_used = 0x1abf620, regular_block_artificial_uses = 0x1abf630,
  eh_block_artificial_uses = 0x1abf640, entry_block_defs = 0x1abf650,
  exit_block_uses = 0x1abf660, insns_to_delete = 0x1aceb28,
  insns_to_rescan = 0x1aceb38, insns_to_notes_rescan = 0x1aceb48,
  postorder = 0x1ada900, postorder_inverted = 0x1ada940, n_blocks = 11,
  n_blocks_inverted = 11, hard_regs_live_count = 0x1ab63e8, ref_order = 1846,
  changeable_flags = 0}
(gdb) print df->problems_by_index[2]
$6 = (struct dataflow *) 0x0
(gdb)


  Hmm, this looks like a dataflow bug to me.  I believe the problem is that
DF_LIVE_OUT assumes/requires problems_by_index[DF_LIVE] to be non-NULL.

    cheers,
      DaveK
-- 
Can't think of a witty .sigline today....


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]