Handle the case of a no-return invoke correctly. It actually still has
authorChandler Carruth <chandlerc@gmail.com>
Wed, 23 Nov 2011 08:23:54 +0000 (08:23 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Wed, 23 Nov 2011 08:23:54 +0000 (08:23 +0000)
successors, they just are all landing pad successors. We handle this the
same way as no successors. Comments attached for the next person to wade
through here and another lovely test case courtesy of Benjamin Kramer's
bugpoint reduction.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145098 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MachineBasicBlock.cpp
test/CodeGen/X86/block-placement.ll

index f05b6c1eb977ac6fb86f35b004825df2c1f6b246..b9d1ef7c68c6951e6bb717c54cf4115768b184ba 100644 (file)
@@ -305,6 +305,14 @@ void MachineBasicBlock::updateTerminator() {
         assert(!TBB && "Found more than one non-landing-pad successor!");
         TBB = *SI;
       }
+
+      // If there is no non-landing-pad successor, the block has no
+      // fall-through edges to be concerned with.
+      if (!TBB)
+        return;
+
+      // Finally update the unconditional successor to be reached via a branch
+      // if it would not be reached by fallthrough.
       if (!isLayoutSuccessor(TBB))
         TII->InsertBranch(*this, TBB, 0, Cond, dl);
     }
index 05d6f8138f9194caec8d32e6300b669c141b33da..c03b03ed02d849255c84d23557594ec98444e992 100644 (file)
@@ -504,6 +504,30 @@ loop:
   br label %loop
 }
 
+declare void @fake_throw() noreturn
+
+define void @test_eh_throw() {
+; For blocks containing a 'throw' (or similar functionality), we have
+; a no-return invoke. In this case, only EH successors will exist, and
+; fallthrough simply won't occur. Make sure we don't crash trying to update
+; terminators for such constructs.
+;
+; CHECK: test_eh_throw
+; CHECK: %entry
+; CHECK: %cleanup
+
+entry:
+  invoke void @fake_throw() to label %continue unwind label %cleanup
+
+continue:
+  unreachable
+
+cleanup:
+  %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
+          cleanup
+  unreachable
+}
+
 define void @test_unnatural_cfg_backwards_inner_loop() {
 ; Test that when we encounter an unnatural CFG structure after having formed
 ; a chain for an inner loop which happened to be laid out backwards we don't