Hi! I've backported this fix to 4.8 branch, acked by Vlad on IRC, bootstrapped/regtested on x86_64-linux and i686-linux, committed to 4.8 branch.
2014-09-08 Jakub Jelinek <ja...@redhat.com> Backported from mainline 2014-08-06 Vladimir Makarov <vmaka...@redhat.com> PR debug/61923 * haifa-sched.c (advance_one_cycle): Fix dump. (schedule_block): Don't advance cycle if we are already at the beginning of the cycle. * gcc.target/i386/pr61923.c: New test. --- gcc/haifa-sched.c (revision 213674) +++ gcc/haifa-sched.c (revision 213675) @@ -2931,7 +2931,7 @@ advance_one_cycle (void) { advance_state (curr_state); if (sched_verbose >= 6) - fprintf (sched_dump, ";;\tAdvanced a state.\n"); + fprintf (sched_dump, ";;\tAdvance the current state.\n"); } /* Update register pressure after scheduling INSN. */ @@ -5964,6 +5964,7 @@ schedule_block (basic_block *target_bb, modulo_insns_scheduled = 0; ls.modulo_epilogue = false; + ls.first_cycle_insn_p = true; /* Loop until all the insns in BB are scheduled. */ while ((*current_sched_info->schedule_more_p) ()) @@ -6034,7 +6035,6 @@ schedule_block (basic_block *target_bb, if (must_backtrack) goto do_backtrack; - ls.first_cycle_insn_p = true; ls.shadows_only_p = false; cycle_issued_insns = 0; ls.can_issue_more = issue_rate; @@ -6321,11 +6321,13 @@ schedule_block (basic_block *target_bb, break; } } + ls.first_cycle_insn_p = true; } if (ls.modulo_epilogue) success = true; end_schedule: - advance_one_cycle (); + if (!ls.first_cycle_insn_p) + advance_one_cycle (); perform_replacements_new_cycle (); if (modulo_ii > 0) { --- gcc/testsuite/gcc.target/i386/pr61923.c (revision 0) +++ gcc/testsuite/gcc.target/i386/pr61923.c (revision 213675) @@ -0,0 +1,36 @@ +/* PR debug/61923 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcompare-debug" } */ + +typedef struct +{ + struct + { + struct + { + char head; + } tickets; + }; +} arch_spinlock_t; +struct ext4_map_blocks +{ + int m_lblk; + int m_len; + int m_flags; +}; +int ext4_da_map_blocks_ei_0; +void fn1 (int p1, struct ext4_map_blocks *p2) +{ + int ret; + if (p2->m_flags) + { + ext4_da_map_blocks_ei_0++; + arch_spinlock_t *lock; + switch (sizeof *&lock->tickets.head) + case 1: + asm("" : "+m"(*&lock->tickets.head) : ""(0)); + __asm__(""); + ret = 0; + } + fn2 (p2->m_lblk, p2->m_len); +} Jakub