While folding unconditional return move DbgRegionEndInst into the predecessor, instea...
authorDevang Patel <dpatel@apple.com>
Tue, 24 Feb 2009 00:05:16 +0000 (00:05 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 24 Feb 2009 00:05:16 +0000 (00:05 +0000)
gcc.c-torture/execute/20000605-3.c
gcc.c-torture/execute/20020619-1.c
gcc.c-torture/execute/20030920-1.c
gcc.c-torture/execute/loop-ivopts-1.c

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

lib/Transforms/Utils/BasicBlockUtils.cpp
lib/Transforms/Utils/SimplifyCFG.cpp
test/Transforms/SimplifyCFG/dbginfo.ll

index 964fcc083d245501cf80ce3f486835fd07b1dabc..7b633b20077d443e97154d56d11c1d1e4829c0d0 100644 (file)
@@ -15,7 +15,6 @@
 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
 #include "llvm/Function.h"
 #include "llvm/Instructions.h"
-#include "llvm/IntrinsicInst.h"
 #include "llvm/Constant.h"
 #include "llvm/Type.h"
 #include "llvm/Analysis/AliasAnalysis.h"
@@ -32,7 +31,7 @@ void llvm::DeleteDeadBlock(BasicBlock *BB) {
          // Can delete self loop.
          BB->getSinglePredecessor() == BB) && "Block is not dead!");
   TerminatorInst *BBTerm = BB->getTerminator();
-  Value *DbgRegionEndContext = NULL;
+  
   // Loop through all of our successors and make sure they know that one
   // of their predecessors is going away.
   for (unsigned i = 0, e = BBTerm->getNumSuccessors(); i != e; ++i)
@@ -41,10 +40,6 @@ void llvm::DeleteDeadBlock(BasicBlock *BB) {
   // Zap all the instructions in the block.
   while (!BB->empty()) {
     Instruction &I = BB->back();
-    // It is possible to have multiple llvm.dbg.region.end in a block.
-    if (DbgRegionEndInst *DREI = dyn_cast<DbgRegionEndInst>(&I))
-      DbgRegionEndContext = DREI->getContext();
-
     // If this instruction is used, replace uses with an arbitrary value.
     // Because control flow can't get here, we don't care what we replace the
     // value with.  Note that since this block is unreachable, and all values
@@ -54,22 +49,7 @@ void llvm::DeleteDeadBlock(BasicBlock *BB) {
       I.replaceAllUsesWith(UndefValue::get(I.getType()));
     BB->getInstList().pop_back();
   }
-
-  if (DbgRegionEndContext) {
-    // Delete corresponding llvm.dbg.func.start from entry block.
-    BasicBlock &Entry = BB->getParent()->getEntryBlock();
-    DbgFuncStartInst *DbgFuncStart = NULL;
-    for (BasicBlock::iterator BI = Entry.begin(), BE = Entry.end();
-           BI != BE; ++BI) {
-      if (DbgFuncStartInst *DFSI = dyn_cast<DbgFuncStartInst>(BI)) {
-        DbgFuncStart = DFSI;
-        break;
-      }
-    }
-    if (DbgFuncStart && DbgFuncStart->getSubprogram() == DbgRegionEndContext)
-      DbgFuncStart->eraseFromParent();
-  }
-    
+  
   // Zap the block!
   BB->eraseFromParent();
 }
index 86d4a7508c5c252988a0d696655c44fea4700491..6c14a643e8153f32bedf8ec3a82732420246bc64 100644 (file)
@@ -1789,6 +1789,13 @@ bool llvm::SimplifyCFG(BasicBlock *BB) {
           Instruction *NewRet = RI->clone();
           Pred->getInstList().push_back(NewRet);
 
+          BasicBlock::iterator BBI = RI;
+          if (BBI != BB->begin()) {
+            // Move region end info into the predecessor.
+            if (DbgRegionEndInst *DREI = dyn_cast<DbgRegionEndInst>(--BBI))
+              DREI->moveBefore(NewRet);
+          }
+
           // If the return instruction returns a value, and if the value was a
           // PHI node in "BB", propagate the right value into the return.
           for (User::op_iterator i = NewRet->op_begin(), e = NewRet->op_end();
@@ -1806,7 +1813,7 @@ bool llvm::SimplifyCFG(BasicBlock *BB) {
         // If we eliminated all predecessors of the block, delete the block now.
         if (pred_begin(BB) == pred_end(BB))
           // We know there are no successors, so just nuke the block.
-          DeleteDeadBlock(BB);
+          M->getBasicBlockList().erase(BB);
 
         return true;
       }
index ddbaccb16587c307fa44a8afc6cf8d9e9430d9f4..38ecbb8f762960273cb386538bbe6f595605cbeb 100644 (file)
@@ -1,5 +1,7 @@
-; RUN: llvm-as < %s | opt -simplifycfg | llvm-dis | grep region | count 1
-; RUN: llvm-as < %s | opt -simplifycfg | llvm-dis | grep func.start | count 1
+; RUN: llvm-as < %s | opt -simplifycfg | llvm-dis | grep region | count 2
+; RUN: llvm-as < %s | opt -simplifycfg | llvm-dis | grep func.start | count 2
+; RUN: llvm-as < %s | opt -simplifycfg | llvm-dis | not grep "br label"
+
        %llvm.dbg.anchor.type = type { i32, i32 }
        %llvm.dbg.basictype.type = type { i32, { }*, i8*, { }*, i32, i64, i64, i64, i32, i32 }
        %llvm.dbg.compile_unit.type = type { i32, { }*, i32, i8*, i8*, i8*, i1, i1, i8* }