diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c77ccda9df9ed1eee64ff305a2fdc36dfa8848eb..174c1c131a34a9cd008dd7b63990936e7b946eab 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-06-04  Aldy Hernandez  <aldyh@redhat.com>
+
+	PR middle-end/47530
+	* trans-mem.c (expand_block_edges): Do not skip the first
+	statement when resetting the BB.
+
 2012-06-04  Richard Guenther  <rguenther@suse.de>
 
 	* tree-data-ref.c (stores_from_loop): Remove.
diff --git a/gcc/testsuite/g++.dg/tm/pr47530-2.C b/gcc/testsuite/g++.dg/tm/pr47530-2.C
new file mode 100644
index 0000000000000000000000000000000000000000..c98e07e541868cfead6d69739b2282b784d28a61
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tm/pr47530-2.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O2 -fno-inline -fdump-tree-tmedge" }
+
+class RBTree
+{
+    struct RBNode
+    {
+      RBNode* next;
+    };
+
+  public:
+    RBNode* sentinel;
+    __attribute__((transaction_safe)) bool lookup();
+};
+
+bool RBTree::lookup()
+{
+  RBNode* x = sentinel;
+  while (x)
+    x = x->next;
+  return false;
+}
+
+
+RBTree* SET;
+
+void bench_test()
+{
+  __transaction_atomic { 
+      SET->lookup();
+    }
+}
+
+// { dg-final { scan-tree-dump-times "ITM_commitTransaction.*tail call" 0 "tmedge" } }
+// { dg-final { cleanup-tree-dump "tmedge" } }
diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c
index 702682300d80155a65290cff4f78537839612573..5aae8b213f11f2f8463e0062d0213258cfd3e528 100644
--- a/gcc/trans-mem.c
+++ b/gcc/trans-mem.c
@@ -2591,6 +2591,7 @@ expand_block_edges (struct tm_region *region, basic_block bb)
 
   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
     {
+      bool do_next = true;
       gimple stmt = gsi_stmt (gsi);
 
       /* ??? TM_COMMIT (and any other tm builtin function) in a nested
@@ -2612,6 +2613,7 @@ expand_block_edges (struct tm_region *region, basic_block bb)
 	      make_tm_edge (stmt, bb, region);
 	      bb = e->dest;
 	      gsi = gsi_start_bb (bb);
+	      do_next = false;
 	    }
 
 	  /* Delete any tail-call annotation that may have been added.
@@ -2620,7 +2622,8 @@ expand_block_edges (struct tm_region *region, basic_block bb)
 	  gimple_call_set_tail (stmt, false);
 	}
 
-      gsi_next (&gsi);
+      if (do_next)
+	gsi_next (&gsi);
     }
 }