Fix another case where debug info was affecting
authorDale Johannesen <dalej@apple.com>
Thu, 5 Mar 2009 02:06:48 +0000 (02:06 +0000)
committerDale Johannesen <dalej@apple.com>
Thu, 5 Mar 2009 02:06:48 +0000 (02:06 +0000)
codegen.  I convinced myself it was OK to skip all
pointer bitcasts here too.

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

lib/Transforms/Scalar/InstructionCombining.cpp

index 1679b9f4bcae46c60fc056ac13d32d2fc87c1d94..86f3256a6ee9ec7fde42ef855deeba4ed6351b0a 100644 (file)
@@ -11565,9 +11565,15 @@ Instruction *InstCombiner::visitStoreInst(StoreInst &SI) {
         return Res;
 
   
-  // If this store is the last instruction in the basic block, and if the block
-  // ends with an unconditional branch, try to move it to the successor block.
-  BBI = &SI; ++BBI;
+  // If this store is the last instruction in the basic block (possibly
+  // excepting debug info instructions and the pointer bitcasts that feed
+  // into them), and if the block ends with an unconditional branch, try
+  // to move it to the successor block.
+  BBI = &SI; 
+  do {
+    ++BBI;
+  } while (isa<DbgInfoIntrinsic>(BBI) ||
+           (isa<BitCastInst>(BBI) && isa<PointerType>(BBI->getType())));
   if (BranchInst *BI = dyn_cast<BranchInst>(BBI))
     if (BI->isUnconditional())
       if (SimplifyStoreAtEndOfBlock(SI))
@@ -11625,8 +11631,15 @@ bool InstCombiner::SimplifyStoreAtEndOfBlock(StoreInst &SI) {
   // else' case.  there is an instruction before the branch.
   StoreInst *OtherStore = 0;
   if (OtherBr->isUnconditional()) {
-    // If this isn't a store, or isn't a store to the same location, bail out.
     --BBI;
+    // Skip over debugging info.
+    while (isa<DbgInfoIntrinsic>(BBI) ||
+           (isa<BitCastInst>(BBI) && isa<PointerType>(BBI->getType()))) {
+      if (BBI==OtherBB->begin())
+        return false;
+      --BBI;
+    }
+    // If this isn't a store, or isn't a store to the same location, bail out.
     OtherStore = dyn_cast<StoreInst>(BBI);
     if (!OtherStore || OtherStore->getOperand(1) != SI.getOperand(1))
       return false;