diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be5aeebdfd534140fbc963c9cacc4689e9756e2f..ca501249a3a51216501df3682a3ac053c6261a00 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-09-06 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/54455 + * sel-sched-ir.c (maybe_tidy_empty_bb): Give up if previous fallthru + bb ends up with asm goto referencing bb's label. + 2012-09-06 Chen Liqin <liqin.gcc@gmail.com> * config/score/score.c: Remove TARGET_LEGITIMIZE_ADDRESS define diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9b616c2af3a6025ed89e32bdba8ed272cc496aac..d237a24ef4f72e3f214b722f04e4e648bc881fc2 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,4 @@ -2012-09-06 Tobias Burnus +2012-09-06 Tobias Burnus <burnus@net-b.de> PR fortran/54463 * trans-intrinsic.c (gfc_conv_intrinsic_funcall): Fix matmul diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 449efc97cbccb69bb495132b64cac917ad7d4cf2..1f1095ecfed09eda561f49655067f3ed7f4b801d 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -1,5 +1,5 @@ /* Instruction scheduling pass. Selective scheduler and pipeliner. - Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 + Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This file is part of GCC. @@ -3686,6 +3686,22 @@ maybe_tidy_empty_bb (basic_block bb) FOR_EACH_EDGE (e, ei, bb->preds) if (e->flags & EDGE_COMPLEX) return false; + else if (e->flags & EDGE_FALLTHRU) + { + rtx note; + /* If prev bb ends with asm goto, see if any of the + ASM_OPERANDS_LABELs don't point to the fallthru + label. Do not attempt to redirect it in that case. */ + if (JUMP_P (BB_END (e->src)) + && (note = extract_asm_operands (PATTERN (BB_END (e->src))))) + { + int i, n = ASM_OPERANDS_LABEL_LENGTH (note); + + for (i = 0; i < n; ++i) + if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (bb)) + return false; + } + } free_data_sets (bb); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7089b59b1efefa70fea462b7b46356507701ed29..8589e9ec4634e0a69553aa42ae9238c90c2004f5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,9 @@ -2012-09-06 Tobias Burnus +2012-09-06 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/54455 + * gcc.dg/54455.c: New test. + +2012-09-06 Tobias Burnus <burnus@net-b.de> PR fortran/54463 * gfortran.dg/promotion_2.f90: New. diff --git a/gcc/testsuite/gcc.dg/54455.c b/gcc/testsuite/gcc.dg/54455.c new file mode 100644 index 0000000000000000000000000000000000000000..de68a53e2335c1175560c0ddf67c7e3fa029a9a8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/54455.c @@ -0,0 +1,25 @@ +/* PR rtl-optimization/54455 */ +/* { dg-do compile } */ +/* { dg-options "-O1 -fschedule-insns -fselective-scheduling --param max-sched-extend-regions-iters=2" } */ + +extern void fn1 (void), fn2 (void); + +static inline __attribute__((always_inline)) int +foo (int *x, long y) +{ + asm goto ("" : : "r" (x), "r" (y) : "memory" : lab); + return 0; +lab: + return 1; +} + +void +bar (int *x) +{ + if (foo (x, 23)) + fn1 (); + else + fn2 (); + + foo (x, 2); +}