diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2009-11-05 17:17:44 +0000 | 
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2009-11-05 17:17:44 +0000 | 
| commit | 72cc50852bec44580ee7efe1aa2076273008a6ae (patch) | |
| tree | adc0bc5dc9cb37579ee90d3c0f08c98c0711bebe /lib/Transforms/Scalar/DeadStoreElimination.cpp | |
| parent | fc25e9aa52455d7aa75f3237afd79b8d89548bb5 (diff) | |
Notes
Diffstat (limited to 'lib/Transforms/Scalar/DeadStoreElimination.cpp')
| -rw-r--r-- | lib/Transforms/Scalar/DeadStoreElimination.cpp | 19 | 
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/Transforms/Scalar/DeadStoreElimination.cpp b/lib/Transforms/Scalar/DeadStoreElimination.cpp index 60b12fd8679e..90436f40661c 100644 --- a/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -78,6 +78,21 @@ static RegisterPass<DSE> X("dse", "Dead Store Elimination");  FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); } +/// isValueAtLeastAsBigAs - Return true if V1 is greater than or equal to the +/// stored size of V2.  This returns false if we don't know. +/// +static bool isValueAtLeastAsBigAs(Value *V1, Value *V2, const TargetData *TD) { +  const Type *V1Ty = V1->getType(), *V2Ty = V2->getType(); +   +  // Exactly the same type, must have exactly the same size. +  if (V1Ty == V2Ty) return true; +   +  // If we don't have target data, we don't know. +  if (TD == 0) return false; +   +  return TD->getTypeStoreSize(V1Ty) >= TD->getTypeStoreSize(V2Ty); +} +  bool DSE::runOnBasicBlock(BasicBlock &BB) {    MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();    TD = getAnalysisIfAvailable<TargetData>(); @@ -118,9 +133,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {      // If this is a store-store dependence, then the previous store is dead so      // long as this store is at least as big as it.      if (StoreInst *DepStore = dyn_cast<StoreInst>(InstDep.getInst())) -      if (TD && -          TD->getTypeStoreSize(DepStore->getOperand(0)->getType()) <= -          TD->getTypeStoreSize(SI->getOperand(0)->getType())) { +      if (isValueAtLeastAsBigAs(SI->getOperand(0), DepStore->getOperand(0),TD)){          // Delete the store and now-dead instructions that feed it.          DeleteDeadInstruction(DepStore);          NumFastStores++;  | 
