http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55845
Uros Bizjak <ubizjak at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bonzini at gnu dot org --- Comment #9 from Uros Bizjak <ubizjak at gmail dot com> 2013-01-06 13:23:54 UTC --- It is try_head_merge_bb that moves unspec_volatile to the wrong place. However, the core of the problem lies in can_move_insns_accross, which does not special-case unspec_volatiles. The untested df-problems.c patch that fixes the failing testcase: --cut here-- Index: df-problems.c =================================================================== --- df-problems.c (revision 194945) +++ df-problems.c (working copy) @@ -3916,6 +3916,10 @@ can_move_insns_across (rtx from, rtx to, rtx acros break; if (NONDEBUG_INSN_P (insn)) { + /* Do not move unspec_volatile insns. */ + if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE) + break; + if (may_trap_or_fault_p (PATTERN (insn)) && (trapping_insns_in_across || other_branch_live != NULL)) break; --cut here-- Adding Paolo B. to CC.