diff --git a/lib/CodeGen/MachineBlockPlacement.cpp b/lib/CodeGen/MachineBlockPlacement.cpp
index ae0f5bd0bcc..e4ddb043505 100644
--- a/lib/CodeGen/MachineBlockPlacement.cpp
+++ b/lib/CodeGen/MachineBlockPlacement.cpp
@@ -68,13 +68,6 @@ ExitBlockBias("block-placement-exit-block-bias",
                        "over the original exit to be considered the new exit."),
               cl::init(0), cl::Hidden);
 
-static cl::opt<bool> PlaceLastSuccessor(
-    "place-last-successor",
-    cl::desc("When selecting a non-successor block, choose the last block to "
-             "have been a successor. This represents the block whose "
-             "predecessor was most recently placed."),
-    cl::init(false), cl::Hidden);
-
 static cl::opt<bool> OutlineOptionalBranches(
     "outline-optional-branches",
     cl::desc("Put completely optional branches, i.e. branches with a common "
@@ -450,25 +443,6 @@ MachineBasicBlock *MachineBlockPlacement::selectBestSuccessor(
 MachineBasicBlock *MachineBlockPlacement::selectBestCandidateBlock(
     BlockChain &Chain, SmallVectorImpl<MachineBasicBlock *> &WorkList,
     const BlockFilterSet *BlockFilter) {
-  if (PlaceLastSuccessor) {
-    // If we're just placing the last successor as the best candidate, the
-    // logic is super simple. We skip the already placed entries on the
-    // worklist and return the most recently added entry that isn't placed.
-    while (!WorkList.empty()) {
-      MachineBasicBlock *SuccBB = WorkList.pop_back_val();
-      BlockChain &SuccChain = *BlockToChain.lookup(SuccBB);
-      if (&SuccChain == &Chain) {
-        DEBUG(dbgs() << "    " << getBlockName(SuccBB)
-                     << " -> Already merged!\n");
-        continue;
-      }
-      assert(SuccChain.LoopPredecessors == 0 && "Found CFG-violating block");
-      return SuccBB;
-    }
-
-    return nullptr;
-  }
-
   // Once we need to walk the worklist looking for a candidate, cleanup the
   // worklist of already placed entries.
   // FIXME: If this shows up on profiles, it could be folded (at the cost of
diff --git a/test/CodeGen/X86/block-placement.ll b/test/CodeGen/X86/block-placement.ll
index 49ee1b2c162..e0276e42d4d 100644
--- a/test/CodeGen/X86/block-placement.ll
+++ b/test/CodeGen/X86/block-placement.ll
@@ -1,4 +1,4 @@
-; RUN: llc -mtriple=i686-linux -place-last-successor -pre-RA-sched=source < %s | FileCheck %s
+; RUN: llc -mtriple=i686-linux -pre-RA-sched=source < %s | FileCheck %s
 
 declare void @error(i32 %i, i32 %a, i32 %b)
 
@@ -17,11 +17,11 @@ define i32 @test_ifchains(i32 %i, i32* %a, i32 %b) {
 ; CHECK: %else4
 ; CHECK-NOT: .align
 ; CHECK: %exit
-; CHECK: %then5
-; CHECK: %then4
-; CHECK: %then3
-; CHECK: %then2
 ; CHECK: %then1
+; CHECK: %then2
+; CHECK: %then3
+; CHECK: %then4
+; CHECK: %then5
 
 entry:
   %gep1 = getelementptr i32, i32* %a, i32 1
@@ -82,9 +82,9 @@ define i32 @test_loop_cold_blocks(i32 %i, i32* %a) {
 ; CHECK-LABEL: test_loop_cold_blocks:
 ; CHECK: %entry
 ; CHECK-NOT: .align
-; CHECK: %unlikely2
-; CHECK-NOT: .align
 ; CHECK: %unlikely1
+; CHECK-NOT: .align
+; CHECK: %unlikely2
 ; CHECK: .align
 ; CHECK: %body1
 ; CHECK: %body2
@@ -135,9 +135,9 @@ define i32 @test_loop_early_exits(i32 %i, i32* %a) {
 ; CHECK: %body3
 ; CHECK: %body4
 ; CHECK: %exit
-; CHECK: %bail3
-; CHECK: %bail2
 ; CHECK: %bail1
+; CHECK: %bail2
+; CHECK: %bail3
 
 entry:
   br label %body1
@@ -1083,87 +1083,3 @@ exit:
   %ret = phi i32 [ %val1, %then ], [ %val2, %else ]
   ret i32 %ret
 }
-
-define void @test_outlined() {
-; This test ends up with diamond control flow in outlined optional regions.
-; These diamonds should still be locally cohensive even when out-of-line due to
-; being cold.
-; CHECK-LABEL: test_outlined:
-; CHECK: %a1
-; CHECK: %a2
-; CHECK: %done
-; CHECK: %b2
-; CHECK: %c2
-; CHECK: %d2
-; CHECK: %f2
-; CHECK: %b1
-; CHECK: %c1
-; CHECK: %d1
-; CHECK: %f1
-
-a1:
-  %call.a1 = call i1 @a1()
-  br i1 %call.a1, label %b1, label %a2, !prof !0
-
-b1:
-  %call.b1 = call i1 @b1()
-  br i1 %call.b1, label %c1, label %d1
-
-c1:
-  call void @c1()
-  br label %f1
-
-d1:
-  call void @d1()
-  br label %f1
-
-f1:
-  call void @f1()
-  br label %a2
-
-a2:
-  %call.a2 = call i1 @a2()
-  br i1 %call.a2, label %b2, label %done, !prof !0
-
-b2:
-  %call.b2 = call i1 @b2()
-  br i1 %call.b2, label %c2, label %d2
-
-c2:
-  call void @c2()
-  br label %f2
-
-d2:
-  call void @d2()
-  br label %f2
-
-f2:
-  call void @f2()
-  br label %done
-
-done:
-  call void @done()
-  ret void
-}
-
-declare i1 @a1()
-
-declare i1 @b1()
-
-declare void @c1()
-
-declare void @d1()
-
-declare void @f1()
-
-declare i1 @a2()
-
-declare i1 @b2()
-
-declare void @c2()
-
-declare void @d2()
-
-declare void @f2()
-
-declare void @done()