When sinking an insn in InstCombine bring its debug
authorDale Johannesen <dalej@apple.com>
Tue, 3 Mar 2009 01:09:07 +0000 (01:09 +0000)
committerDale Johannesen <dalej@apple.com>
Tue, 3 Mar 2009 01:09:07 +0000 (01:09 +0000)
info with it.
Don't count debug info insns against the scan maximum
in FindAvailableLoadedValue (lest they affect codegen).

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

include/llvm/Transforms/Utils/BasicBlockUtils.h
lib/Transforms/Scalar/InstructionCombining.cpp
lib/Transforms/Utils/BasicBlockUtils.cpp

index 429d3b6edcf2e61808472479f135a13a4535d35a..a629b119bc37d9bc0d9be151dc16a167125b80f1 100644 (file)
@@ -60,6 +60,11 @@ void ReplaceInstWithInst(BasicBlock::InstListType &BIL,
 //
 void ReplaceInstWithInst(Instruction *From, Instruction *To);
 
+/// CopyPrecedingStopPoint - If I is immediately preceded by a StopPoint,
+/// make a copy of the stoppoint before InsertPos (presumably before copying
+/// or moving I).
+void CopyPrecedingStopPoint(Instruction *I, BasicBlock::iterator InsertPos);
+
 /// FindAvailableLoadedValue - Scan the ScanBB block backwards (starting at the
 /// instruction before ScanFrom) checking to see if we have the value at the
 /// memory address *Ptr locally available within a small number of instructions.
index 7ddbb4ca7cb10a7e70220d67e0ca4be0ff79c460..e0d3ac4d4282ce918c2c0fcb626e4fd0b8563790 100644 (file)
@@ -12374,6 +12374,7 @@ static bool TryToSinkInstruction(Instruction *I, BasicBlock *DestBlock) {
 
   BasicBlock::iterator InsertPos = DestBlock->getFirstNonPHI();
 
+  CopyPrecedingStopPoint(I, InsertPos);
   I->moveBefore(InsertPos);
   ++NumSunkInst;
   return true;
index 7b633b20077d443e97154d56d11c1d1e4829c0d0..875de559b76ab2062593b7bb2cab209ea4e11d68 100644 (file)
@@ -15,6 +15,7 @@
 #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"
@@ -471,11 +472,18 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
   }
   
   while (ScanFrom != ScanBB->begin()) {
+    // We must ignore debug info directives when counting (otherwise they
+    // would affect codegen).
+    Instruction *Inst = --ScanFrom;
+    if (isa<DbgInfoIntrinsic>(Inst))
+      continue;
+    // Restore ScanFrom to expected value in case next test succeeds
+    ScanFrom++;
+   
     // Don't scan huge blocks.
     if (MaxInstsToScan-- == 0) return 0;
     
-    Instruction *Inst = --ScanFrom;
-    
+    --ScanFrom;
     // If this is a load of Ptr, the loaded value is available.
     if (LoadInst *LI = dyn_cast<LoadInst>(Inst))
       if (AreEquivalentAddressValues(LI->getOperand(0), Ptr))
@@ -523,3 +531,18 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
   // block.
   return 0;
 }
+
+/// CopyPrecedingStopPoint - If I is immediately preceded by a StopPoint,
+/// make a copy of the stoppoint before InsertPos (presumably before copying
+/// or moving I).
+void llvm::CopyPrecedingStopPoint(Instruction *I, 
+                                  BasicBlock::iterator InsertPos) {
+  if (I != I->getParent()->begin()) {
+    BasicBlock::iterator BBI = I;  --BBI;
+    if (DbgStopPointInst *DSPI = dyn_cast<DbgStopPointInst>(BBI)) {
+      DbgStopPointInst *newDSPI =
+        reinterpret_cast<DbgStopPointInst*>(DSPI->clone());
+      newDSPI->insertBefore(InsertPos);
+    }
+  }
+}