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);
+}