Related to r181161 - Indirect branches may not be the last branch in a basic
authorLang Hames <lhames@gmail.com>
Tue, 16 Jul 2013 22:01:40 +0000 (22:01 +0000)
committerLang Hames <lhames@gmail.com>
Tue, 16 Jul 2013 22:01:40 +0000 (22:01 +0000)
block. Blocks that have an indirect branch terminator, even if it's not the
last terminator, should still be treated as unanalyzable.

<rdar://problem/14437274>

Reducing a useful regression test case is proving difficult - I hope to have
one soon.

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

lib/Target/ARM/ARMBaseInstrInfo.cpp

index d6701782a477dba71476cf5258434fb46da42db6..5d012fcc0210e1bbf087e095b5d098932dd05195 100644 (file)
@@ -295,6 +295,11 @@ ARMBaseInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,MachineBasicBlock *&TBB,
   if (!isUnpredicatedTerminator(I))
     return false;
 
+  // Check whether the second-to-last branch is indirect, return
+  // 'unanalyzeable' here too.
+  if (I != MBB.begin() && prior(I)->isIndirectBranch())
+    return true;
+
   // If there is only one terminator instruction, process it.
   if (I == MBB.begin() || !isUnpredicatedTerminator(--I)) {
     if (isUncondBranchOpcode(LastOpc)) {
@@ -322,6 +327,8 @@ ARMBaseInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,MachineBasicBlock *&TBB,
       LastInst->eraseFromParent();
       LastInst = SecondLastInst;
       LastOpc = LastInst->getOpcode();
+      if (I != MBB.begin() && prior(I)->isIndirectBranch())
+        return true; // Indirect branches are unanalyzeable.
       if (I == MBB.begin() || !isUnpredicatedTerminator(--I)) {
         // Return now the only terminator is an unconditional branch.
         TBB = LastInst->getOperand(0).getMBB();