forked from OSchip/llvm-project
switch InstCombine::visitLoadInst to use
FindAvailableLoadedValue llvm-svn: 60169
This commit is contained in:
parent
378b041f03
commit
e0d019def6
|
@ -10762,31 +10762,6 @@ static bool isSafeToLoadUnconditionally(Value *V, Instruction *ScanFrom) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// equivalentAddressValues - Test if A and B will obviously have the same
|
|
||||||
/// value. This includes recognizing that %t0 and %t1 will have the same
|
|
||||||
/// value in code like this:
|
|
||||||
/// %t0 = getelementptr @a, 0, 3
|
|
||||||
/// store i32 0, i32* %t0
|
|
||||||
/// %t1 = getelementptr @a, 0, 3
|
|
||||||
/// %t2 = load i32* %t1
|
|
||||||
///
|
|
||||||
static bool equivalentAddressValues(Value *A, Value *B) {
|
|
||||||
// Test if the values are trivially equivalent.
|
|
||||||
if (A == B) return true;
|
|
||||||
|
|
||||||
// Test if the values come form identical arithmetic instructions.
|
|
||||||
if (isa<BinaryOperator>(A) ||
|
|
||||||
isa<CastInst>(A) ||
|
|
||||||
isa<PHINode>(A) ||
|
|
||||||
isa<GetElementPtrInst>(A))
|
|
||||||
if (Instruction *BI = dyn_cast<Instruction>(B))
|
|
||||||
if (cast<Instruction>(A)->isIdenticalTo(BI))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Otherwise they may not be equivalent.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
|
Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
|
||||||
Value *Op = LI.getOperand(0);
|
Value *Op = LI.getOperand(0);
|
||||||
|
|
||||||
|
@ -10809,22 +10784,8 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
|
||||||
// where there are several consequtive memory accesses to the same location,
|
// where there are several consequtive memory accesses to the same location,
|
||||||
// separated by a few arithmetic operations.
|
// separated by a few arithmetic operations.
|
||||||
BasicBlock::iterator BBI = &LI;
|
BasicBlock::iterator BBI = &LI;
|
||||||
for (unsigned ScanInsts = 6; BBI != LI.getParent()->begin() && ScanInsts;
|
if (Value *AvailableVal = FindAvailableLoadedValue(Op, LI.getParent(), BBI,6))
|
||||||
--ScanInsts) {
|
return ReplaceInstUsesWith(LI, AvailableVal);
|
||||||
--BBI;
|
|
||||||
|
|
||||||
if (StoreInst *SI = dyn_cast<StoreInst>(BBI)) {
|
|
||||||
if (equivalentAddressValues(SI->getOperand(1), LI.getOperand(0)))
|
|
||||||
return ReplaceInstUsesWith(LI, SI->getOperand(0));
|
|
||||||
} else if (LoadInst *LIB = dyn_cast<LoadInst>(BBI)) {
|
|
||||||
if (equivalentAddressValues(LIB->getOperand(0), LI.getOperand(0)))
|
|
||||||
return ReplaceInstUsesWith(LI, LIB);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't skip over things that can modify memory.
|
|
||||||
if (BBI->mayWriteToMemory())
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) {
|
if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) {
|
||||||
const Value *GEPI0 = GEPI->getOperand(0);
|
const Value *GEPI0 = GEPI->getOperand(0);
|
||||||
|
@ -10991,6 +10952,31 @@ static Instruction *InstCombineStoreToCast(InstCombiner &IC, StoreInst &SI) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// equivalentAddressValues - Test if A and B will obviously have the same
|
||||||
|
/// value. This includes recognizing that %t0 and %t1 will have the same
|
||||||
|
/// value in code like this:
|
||||||
|
/// %t0 = getelementptr @a, 0, 3
|
||||||
|
/// store i32 0, i32* %t0
|
||||||
|
/// %t1 = getelementptr @a, 0, 3
|
||||||
|
/// %t2 = load i32* %t1
|
||||||
|
///
|
||||||
|
static bool equivalentAddressValues(Value *A, Value *B) {
|
||||||
|
// Test if the values are trivially equivalent.
|
||||||
|
if (A == B) return true;
|
||||||
|
|
||||||
|
// Test if the values come form identical arithmetic instructions.
|
||||||
|
if (isa<BinaryOperator>(A) ||
|
||||||
|
isa<CastInst>(A) ||
|
||||||
|
isa<PHINode>(A) ||
|
||||||
|
isa<GetElementPtrInst>(A))
|
||||||
|
if (Instruction *BI = dyn_cast<Instruction>(B))
|
||||||
|
if (cast<Instruction>(A)->isIdenticalTo(BI))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Otherwise they may not be equivalent.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Instruction *InstCombiner::visitStoreInst(StoreInst &SI) {
|
Instruction *InstCombiner::visitStoreInst(StoreInst &SI) {
|
||||||
Value *Val = SI.getOperand(0);
|
Value *Val = SI.getOperand(0);
|
||||||
Value *Ptr = SI.getOperand(1);
|
Value *Ptr = SI.getOperand(1);
|
||||||
|
@ -11036,8 +11022,8 @@ Instruction *InstCombiner::visitStoreInst(StoreInst &SI) {
|
||||||
|
|
||||||
if (StoreInst *PrevSI = dyn_cast<StoreInst>(BBI)) {
|
if (StoreInst *PrevSI = dyn_cast<StoreInst>(BBI)) {
|
||||||
// Prev store isn't volatile, and stores to the same location?
|
// Prev store isn't volatile, and stores to the same location?
|
||||||
if (!PrevSI->isVolatile() && equivalentAddressValues(PrevSI->getOperand(1),
|
if (!PrevSI->isVolatile() &&equivalentAddressValues(PrevSI->getOperand(1),
|
||||||
SI.getOperand(1))) {
|
SI.getOperand(1))) {
|
||||||
++NumDeadStore;
|
++NumDeadStore;
|
||||||
++BBI;
|
++BBI;
|
||||||
EraseInstFromFunction(*PrevSI);
|
EraseInstFromFunction(*PrevSI);
|
||||||
|
|
|
@ -373,6 +373,29 @@ BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,
|
||||||
return NewBB;
|
return NewBB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// AreEquivalentAddressValues - Test if A and B will obviously have the same
|
||||||
|
/// value. This includes recognizing that %t0 and %t1 will have the same
|
||||||
|
/// value in code like this:
|
||||||
|
/// %t0 = getelementptr @a, 0, 3
|
||||||
|
/// store i32 0, i32* %t0
|
||||||
|
/// %t1 = getelementptr @a, 0, 3
|
||||||
|
/// %t2 = load i32* %t1
|
||||||
|
///
|
||||||
|
static bool AreEquivalentAddressValues(const Value *A, const Value *B) {
|
||||||
|
// Test if the values are trivially equivalent.
|
||||||
|
if (A == B) return true;
|
||||||
|
|
||||||
|
// Test if the values come form identical arithmetic instructions.
|
||||||
|
if (isa<BinaryOperator>(A) || isa<CastInst>(A) ||
|
||||||
|
isa<PHINode>(A) || isa<GetElementPtrInst>(A))
|
||||||
|
if (const Instruction *BI = dyn_cast<Instruction>(B))
|
||||||
|
if (cast<Instruction>(A)->isIdenticalTo(BI))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Otherwise they may not be equivalent.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// 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.
|
||||||
|
@ -407,12 +430,12 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
|
||||||
|
|
||||||
// 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 (LI->getOperand(0) == Ptr)
|
if (AreEquivalentAddressValues(LI->getOperand(0), Ptr))
|
||||||
return LI;
|
return LI;
|
||||||
|
|
||||||
if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
|
if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
|
||||||
// If this is a store through Ptr, the value is available!
|
// If this is a store through Ptr, the value is available!
|
||||||
if (SI->getOperand(1) == Ptr)
|
if (AreEquivalentAddressValues(SI->getOperand(1), Ptr))
|
||||||
return SI->getOperand(0);
|
return SI->getOperand(0);
|
||||||
|
|
||||||
// If Ptr is an alloca and this is a store to a different alloca, ignore
|
// If Ptr is an alloca and this is a store to a different alloca, ignore
|
||||||
|
|
Loading…
Reference in New Issue