diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-01-08 19:00:10 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-01-08 19:00:10 +0100 |
commit | c6d851b95a7bd268c9ba8576d77e057fa162b855 (patch) | |
tree | fb756f10444e5e6416cb8b94e292ce75b17b24f4 /gcc/df-problems.c | |
parent | 4369c11e008025946fee81886a4b4a841c910408 (diff) | |
download | gcc-c6d851b95a7bd268c9ba8576d77e057fa162b855.zip gcc-c6d851b95a7bd268c9ba8576d77e057fa162b855.tar.gz gcc-c6d851b95a7bd268c9ba8576d77e057fa162b855.tar.bz2 |
re PR rtl-optimization/55845 (454.calculix miscompares with -march=btver2 -O3 -ffastmath -fschedule-insns -mvzeroupper for test data run)
PR rtl-optimization/55845
* df-problems.c (can_move_insns_across): Stop scanning at
volatile_insn_p source instruction or give up if
across_from .. across_to range contains any volatile_insn_p
instructions.
* gcc.target/i386/pr55845.c: New test.
From-SVN: r195028
Diffstat (limited to 'gcc/df-problems.c')
-rw-r--r-- | gcc/df-problems.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/df-problems.c b/gcc/df-problems.c index 89a6189..0af593d 100644 --- a/gcc/df-problems.c +++ b/gcc/df-problems.c @@ -1,6 +1,6 @@ /* Standard problems for dataflow support routines. Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, - 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. Originally contributed by Michael P. Hayes (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com) Major rewrite contributed by Danny Berlin (dberlin@dberlin.org) @@ -3858,6 +3858,8 @@ can_move_insns_across (rtx from, rtx to, rtx across_from, rtx across_to, } if (NONDEBUG_INSN_P (insn)) { + if (volatile_insn_p (PATTERN (insn))) + return false; memrefs_in_across |= for_each_rtx (&PATTERN (insn), find_memory, NULL); note_stores (PATTERN (insn), find_memory_stores, @@ -3917,7 +3919,9 @@ can_move_insns_across (rtx from, rtx to, rtx across_from, rtx across_to, if (NONDEBUG_INSN_P (insn)) { if (may_trap_or_fault_p (PATTERN (insn)) - && (trapping_insns_in_across || other_branch_live != NULL)) + && (trapping_insns_in_across + || other_branch_live != NULL + || volatile_insn_p (PATTERN (insn)))) break; /* We cannot move memory stores past each other, or move memory |