mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-27 12:26:08 +00:00
Fix test/Transforms/DeadStoreElimination/PartialStore.ll, which had been
silently failing because of an incorrect run line for some time. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43605 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -63,14 +63,18 @@ namespace {
|
|||||||
/// from allocas, it is safe to ignore GEP indices, since
|
/// from allocas, it is safe to ignore GEP indices, since
|
||||||
/// either the store will be in the alloca, and thus dead,
|
/// either the store will be in the alloca, and thus dead,
|
||||||
/// or beyond the end of the alloca, and thus undefined.
|
/// or beyond the end of the alloca, and thus undefined.
|
||||||
void TranslatePointerBitCasts(Value*& v) {
|
void TranslatePointerBitCasts(Value*& v, bool zeroGepsOnly = false) {
|
||||||
assert(isa<PointerType>(v->getType()) &&
|
assert(isa<PointerType>(v->getType()) &&
|
||||||
"Translating a non-pointer type?");
|
"Translating a non-pointer type?");
|
||||||
while (true) {
|
while (true) {
|
||||||
if (BitCastInst* C = dyn_cast<BitCastInst>(v))
|
if (BitCastInst* C = dyn_cast<BitCastInst>(v))
|
||||||
v = C->getOperand(0);
|
v = C->getOperand(0);
|
||||||
else if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(v))
|
else if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(v))
|
||||||
v = G->getOperand(0);
|
if (!zeroGepsOnly || G->hasAllZeroIndices()) {
|
||||||
|
v = G->getOperand(0);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -95,7 +99,8 @@ FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); }
|
|||||||
|
|
||||||
bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
||||||
MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
|
MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
|
||||||
|
TargetData &TD = getAnalysis<TargetData>();
|
||||||
|
|
||||||
// Record the last-seen store to this pointer
|
// Record the last-seen store to this pointer
|
||||||
DenseMap<Value*, StoreInst*> lastStore;
|
DenseMap<Value*, StoreInst*> lastStore;
|
||||||
// Record instructions possibly made dead by deleting a store
|
// Record instructions possibly made dead by deleting a store
|
||||||
@@ -119,6 +124,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
|||||||
} else
|
} else
|
||||||
pointer = cast<FreeInst>(BBI)->getPointerOperand();
|
pointer = cast<FreeInst>(BBI)->getPointerOperand();
|
||||||
|
|
||||||
|
TranslatePointerBitCasts(pointer, true);
|
||||||
StoreInst*& last = lastStore[pointer];
|
StoreInst*& last = lastStore[pointer];
|
||||||
bool deletedStore = false;
|
bool deletedStore = false;
|
||||||
|
|
||||||
@@ -130,7 +136,9 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
|||||||
while (dep != MemoryDependenceAnalysis::None &&
|
while (dep != MemoryDependenceAnalysis::None &&
|
||||||
dep != MemoryDependenceAnalysis::NonLocal &&
|
dep != MemoryDependenceAnalysis::NonLocal &&
|
||||||
isa<StoreInst>(dep)) {
|
isa<StoreInst>(dep)) {
|
||||||
if (dep != last) {
|
if (dep != last ||
|
||||||
|
TD.getTypeSize(last->getOperand(0)->getType()) >
|
||||||
|
TD.getTypeSize(BBI->getOperand(0)->getType())) {
|
||||||
dep = MD.getDependency(BBI, dep);
|
dep = MD.getDependency(BBI, dep);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | \
|
; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | \
|
||||||
; RUN: not grep {store sbyte}
|
; RUN: not grep {store i8}
|
||||||
; Ensure that the dead store is deleted in this case. It is wholely
|
; Ensure that the dead store is deleted in this case. It is wholely
|
||||||
; overwritten by the second store.
|
; overwritten by the second store.
|
||||||
int %test() {
|
int %test() {
|
||||||
|
Reference in New Issue
Block a user