Verify that terminators follow non-terminators.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 23 Sep 2011 22:45:39 +0000 (22:45 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 23 Sep 2011 22:45:39 +0000 (22:45 +0000)
This exposes a -segmented-stacks bug.

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

lib/CodeGen/MachineVerifier.cpp
test/CodeGen/X86/segmented-stacks.ll

index 7463d0f564daa6f18ea9f12facc0264f4c64bd3e..e798ba11ea92e9583986a99c4060402e8ea9b346 100644 (file)
@@ -72,6 +72,8 @@ namespace {
     typedef DenseSet<unsigned> RegSet;
     typedef DenseMap<unsigned, const MachineInstr*> RegMap;
 
+    const MachineInstr *FirstTerminator;
+
     BitVector regsReserved;
     RegSet regsLive;
     RegVector regsDefined, regsDead, regsKilled;
@@ -389,6 +391,8 @@ static bool matchPair(MachineBasicBlock::const_succ_iterator i,
 
 void
 MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
+  FirstTerminator = 0;
+
   // Count the number of landing pad successors.
   SmallPtrSet<MachineBasicBlock*, 4> LandingPadSuccs;
   for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(),
@@ -570,6 +574,15 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {
     }
   }
 
+  // Ensure non-terminators don't follow terminators.
+  if (MCID.isTerminator()) {
+    if (!FirstTerminator)
+      FirstTerminator = MI;
+  } else if (FirstTerminator) {
+    report("Non-terminator instruction after the first terminator", MI);
+    *OS << "First terminator was:\t" << *FirstTerminator;
+  }
+
   StringRef ErrorInfo;
   if (!TII->verifyInstruction(MI, ErrorInfo))
     report(ErrorInfo.data(), MI);
index 3f0067e2926b3c72eab2d8f023c91f33ec37a99e..4a76874e8483c88717291668b2c990bdb7db10e6 100644 (file)
@@ -1,5 +1,8 @@
 ; RUN: llc < %s -mtriple=i686-linux -segmented-stacks | FileCheck %s -check-prefix=X32
 ; RUN: llc < %s -mtriple=x86_64-linux  -segmented-stacks | FileCheck %s -check-prefix=X64
+;
+; X86FrameLowering::adjustForSegmentedStacks is inserting code after a RET.
+; XFAIL: *
 
 ; Just to prevent the alloca from being optimized away
 declare void @dummy_use(i32*, i32)