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:
parent
b69b449ce8
commit
33fa9dc8a9
@ -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.
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user