1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

When sinking an insn in InstCombine bring its debug

info with it.
Don't count debug info insns against the scan maximum
in FindAvailableLoadedValue (lest they affect codegen).

llvm-svn: 65910
This commit is contained in:
Dale Johannesen 2009-03-03 01:09:07 +00:00
parent b69b449ce8
commit 33fa9dc8a9
3 changed files with 31 additions and 2 deletions

View File

@ -60,6 +60,11 @@ void ReplaceInstWithInst(BasicBlock::InstListType &BIL,
// //
void ReplaceInstWithInst(Instruction *From, Instruction *To); 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 /// FindAvailableLoadedValue - Scan the ScanBB block backwards (starting at the
/// instruction before ScanFrom) checking to see if we have the value 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. /// memory address *Ptr locally available within a small number of instructions.

View File

@ -12374,6 +12374,7 @@ static bool TryToSinkInstruction(Instruction *I, BasicBlock *DestBlock) {
BasicBlock::iterator InsertPos = DestBlock->getFirstNonPHI(); BasicBlock::iterator InsertPos = DestBlock->getFirstNonPHI();
CopyPrecedingStopPoint(I, InsertPos);
I->moveBefore(InsertPos); I->moveBefore(InsertPos);
++NumSunkInst; ++NumSunkInst;
return true; return true;

View File

@ -15,6 +15,7 @@
#include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Function.h" #include "llvm/Function.h"
#include "llvm/Instructions.h" #include "llvm/Instructions.h"
#include "llvm/IntrinsicInst.h"
#include "llvm/Constant.h" #include "llvm/Constant.h"
#include "llvm/Type.h" #include "llvm/Type.h"
#include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/AliasAnalysis.h"
@ -471,11 +472,18 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
} }
while (ScanFrom != ScanBB->begin()) { 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. // Don't scan huge blocks.
if (MaxInstsToScan-- == 0) return 0; if (MaxInstsToScan-- == 0) return 0;
Instruction *Inst = --ScanFrom; --ScanFrom;
// If this is a load of Ptr, the loaded value is available. // If this is a load of Ptr, the loaded value is available.
if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) if (LoadInst *LI = dyn_cast<LoadInst>(Inst))
if (AreEquivalentAddressValues(LI->getOperand(0), Ptr)) if (AreEquivalentAddressValues(LI->getOperand(0), Ptr))
@ -523,3 +531,18 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
// block. // block.
return 0; 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);
}
}
}