From ee6e10bc8e389ed1a09c33c8cec15b3aa13e813b Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 27 Nov 2008 08:18:12 +0000 Subject: [PATCH] enhance FindAvailableLoadedValue to make use of AliasAnalysis if it has it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60167 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/BasicBlockUtils.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/Transforms/Utils/BasicBlockUtils.cpp b/lib/Transforms/Utils/BasicBlockUtils.cpp index aafeface3e3..d38099f4eb1 100644 --- a/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -20,6 +20,7 @@ #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/Dominators.h" +#include "llvm/Target/TargetData.h" #include using namespace llvm; @@ -390,6 +391,13 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB, unsigned MaxInstsToScan, AliasAnalysis *AA) { if (MaxInstsToScan == 0) MaxInstsToScan = ~0U; + + // If we're using alias analysis to disambiguate get the size of *Ptr. + unsigned AccessSize = 0; + if (AA) { + const Type *AccessTy = cast(Ptr->getType())->getElementType(); + AccessSize = AA->getTargetData().getTypeStoreSizeInBits(AccessTy); + } while (ScanFrom != ScanBB->begin()) { // Don't scan huge blocks. @@ -415,14 +423,25 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB, isa(SI->getOperand(1)))) continue; + // If we have alias analysis and it says the store won't modify the loaded + // value, ignore the store. + if (AA && + (AA->getModRefInfo(SI, Ptr, AccessSize) & AliasAnalysis::Mod) == 0) + continue; + // Otherwise the store that may or may not alias the pointer, bail out. ++ScanFrom; return 0; } - // If this is some other instruction that may clobber Ptr, bail out. if (Inst->mayWriteToMemory()) { + // If alias analysis claims that it really won't modify the load, + // ignore it. + if (AA && + (AA->getModRefInfo(Inst, Ptr, AccessSize) & AliasAnalysis::Mod) == 0) + continue; + // May modify the pointer, bail out. ++ScanFrom; return 0;