mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Add "const" in GetUnderlyingObjects. NFC
Summary: Both the input Value pointer and the returned Value pointers in GetUnderlyingObjects are now declared as const. It turned out that all current (in-tree) uses of GetUnderlyingObjects were trivial to update, being satisfied with have those Value pointers declared as const. Actually, in the past several of the users had to use const_cast, just because of ValueTracking not providing a version of GetUnderlyingObjects with "const" Value pointers. With this patch we get rid of those const casts. Reviewers: hfinkel, materi, jkorous Reviewed By: jkorous Subscribers: dexonsmith, jkorous, jholewinski, sdardis, eraman, hiraditya, jrtc27, atanasyan, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D61038 llvm-svn: 359072
This commit is contained in:
parent
fc78757ece
commit
0ae3f2b8d1
@ -351,7 +351,8 @@ class Value;
|
||||
/// Since A[i] and A[i-1] are independent pointers, getUnderlyingObjects
|
||||
/// should not assume that Curr and Prev share the same underlying object thus
|
||||
/// it shouldn't look through the phi above.
|
||||
void GetUnderlyingObjects(Value *V, SmallVectorImpl<Value *> &Objects,
|
||||
void GetUnderlyingObjects(const Value *V,
|
||||
SmallVectorImpl<const Value *> &Objects,
|
||||
const DataLayout &DL, LoopInfo *LI = nullptr,
|
||||
unsigned MaxLookup = 6);
|
||||
|
||||
|
@ -896,13 +896,13 @@ ModRefInfo GlobalsAAResult::getModRefInfoForArgument(const CallBase *Call,
|
||||
// Iterate through all the arguments to the called function. If any argument
|
||||
// is based on GV, return the conservative result.
|
||||
for (auto &A : Call->args()) {
|
||||
SmallVector<Value*, 4> Objects;
|
||||
SmallVector<const Value*, 4> Objects;
|
||||
GetUnderlyingObjects(A, Objects, DL);
|
||||
|
||||
// All objects must be identified.
|
||||
if (!all_of(Objects, isIdentifiedObject) &&
|
||||
// Try ::alias to see if all objects are known not to alias GV.
|
||||
!all_of(Objects, [&](Value *V) {
|
||||
!all_of(Objects, [&](const Value *V) {
|
||||
return this->alias(MemoryLocation(V), MemoryLocation(GV), AAQI) ==
|
||||
NoAlias;
|
||||
}))
|
||||
|
@ -2281,12 +2281,12 @@ computePointerICmp(const DataLayout &DL, const TargetLibraryInfo *TLI,
|
||||
// come from a pointer that cannot overlap with dynamically-allocated
|
||||
// memory within the lifetime of the current function (allocas, byval
|
||||
// arguments, globals), then determine the comparison result here.
|
||||
SmallVector<Value *, 8> LHSUObjs, RHSUObjs;
|
||||
SmallVector<const Value *, 8> LHSUObjs, RHSUObjs;
|
||||
GetUnderlyingObjects(LHS, LHSUObjs, DL);
|
||||
GetUnderlyingObjects(RHS, RHSUObjs, DL);
|
||||
|
||||
// Is the set of underlying objects all noalias calls?
|
||||
auto IsNAC = [](ArrayRef<Value *> Objects) {
|
||||
auto IsNAC = [](ArrayRef<const Value *> Objects) {
|
||||
return all_of(Objects, isNoAliasCall);
|
||||
};
|
||||
|
||||
@ -2296,8 +2296,8 @@ computePointerICmp(const DataLayout &DL, const TargetLibraryInfo *TLI,
|
||||
// live with the compared-to allocation). For globals, we exclude symbols
|
||||
// that might be resolve lazily to symbols in another dynamically-loaded
|
||||
// library (and, thus, could be malloc'ed by the implementation).
|
||||
auto IsAllocDisjoint = [](ArrayRef<Value *> Objects) {
|
||||
return all_of(Objects, [](Value *V) {
|
||||
auto IsAllocDisjoint = [](ArrayRef<const Value *> Objects) {
|
||||
return all_of(Objects, [](const Value *V) {
|
||||
if (const AllocaInst *AI = dyn_cast<AllocaInst>(V))
|
||||
return AI->getParent() && AI->getFunction() && AI->isStaticAlloca();
|
||||
if (const GlobalValue *GV = dyn_cast<GlobalValue>(V))
|
||||
|
@ -842,7 +842,7 @@ void AccessAnalysis::processMemAccesses() {
|
||||
bool SetHasWrite = false;
|
||||
|
||||
// Map of pointers to last access encountered.
|
||||
typedef DenseMap<Value*, MemAccessInfo> UnderlyingObjToAccessMap;
|
||||
typedef DenseMap<const Value*, MemAccessInfo> UnderlyingObjToAccessMap;
|
||||
UnderlyingObjToAccessMap ObjToLastAccess;
|
||||
|
||||
// Set of access to check after all writes have been processed.
|
||||
@ -903,13 +903,13 @@ void AccessAnalysis::processMemAccesses() {
|
||||
|
||||
// Create sets of pointers connected by a shared alias set and
|
||||
// underlying object.
|
||||
typedef SmallVector<Value *, 16> ValueVector;
|
||||
typedef SmallVector<const Value *, 16> ValueVector;
|
||||
ValueVector TempObjects;
|
||||
|
||||
GetUnderlyingObjects(Ptr, TempObjects, DL, LI);
|
||||
LLVM_DEBUG(dbgs()
|
||||
<< "Underlying objects for pointer " << *Ptr << "\n");
|
||||
for (Value *UnderlyingObj : TempObjects) {
|
||||
for (const Value *UnderlyingObj : TempObjects) {
|
||||
// nullptr never alias, don't join sets for pointer that have "null"
|
||||
// in their UnderlyingObjects list.
|
||||
if (isa<ConstantPointerNull>(UnderlyingObj) &&
|
||||
|
@ -3771,26 +3771,27 @@ Value *llvm::GetUnderlyingObject(Value *V, const DataLayout &DL,
|
||||
return V;
|
||||
}
|
||||
|
||||
void llvm::GetUnderlyingObjects(Value *V, SmallVectorImpl<Value *> &Objects,
|
||||
void llvm::GetUnderlyingObjects(const Value *V,
|
||||
SmallVectorImpl<const Value *> &Objects,
|
||||
const DataLayout &DL, LoopInfo *LI,
|
||||
unsigned MaxLookup) {
|
||||
SmallPtrSet<Value *, 4> Visited;
|
||||
SmallVector<Value *, 4> Worklist;
|
||||
SmallPtrSet<const Value *, 4> Visited;
|
||||
SmallVector<const Value *, 4> Worklist;
|
||||
Worklist.push_back(V);
|
||||
do {
|
||||
Value *P = Worklist.pop_back_val();
|
||||
const Value *P = Worklist.pop_back_val();
|
||||
P = GetUnderlyingObject(P, DL, MaxLookup);
|
||||
|
||||
if (!Visited.insert(P).second)
|
||||
continue;
|
||||
|
||||
if (SelectInst *SI = dyn_cast<SelectInst>(P)) {
|
||||
if (auto *SI = dyn_cast<SelectInst>(P)) {
|
||||
Worklist.push_back(SI->getTrueValue());
|
||||
Worklist.push_back(SI->getFalseValue());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (PHINode *PN = dyn_cast<PHINode>(P)) {
|
||||
if (auto *PN = dyn_cast<PHINode>(P)) {
|
||||
// If this PHI changes the underlying object in every iteration of the
|
||||
// loop, don't look through it. Consider:
|
||||
// int **A;
|
||||
@ -3851,10 +3852,10 @@ bool llvm::getUnderlyingObjectsForCodeGen(const Value *V,
|
||||
do {
|
||||
V = Working.pop_back_val();
|
||||
|
||||
SmallVector<Value *, 4> Objs;
|
||||
GetUnderlyingObjects(const_cast<Value *>(V), Objs, DL);
|
||||
SmallVector<const Value *, 4> Objs;
|
||||
GetUnderlyingObjects(V, Objs, DL);
|
||||
|
||||
for (Value *V : Objs) {
|
||||
for (const Value *V : Objs) {
|
||||
if (!Visited.insert(V).second)
|
||||
continue;
|
||||
if (Operator::getOpcode(V) == Instruction::IntToPtr) {
|
||||
|
@ -846,13 +846,13 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID,
|
||||
|
||||
// Get the underlying objects for the location passed on the lifetime
|
||||
// marker.
|
||||
SmallVector<Value *, 4> Allocas;
|
||||
SmallVector<const Value *, 4> Allocas;
|
||||
GetUnderlyingObjects(CI.getArgOperand(1), Allocas, *DL);
|
||||
|
||||
// Iterate over each underlying object, creating lifetime markers for each
|
||||
// static alloca. Quit if we find a non-static alloca.
|
||||
for (Value *V : Allocas) {
|
||||
AllocaInst *AI = dyn_cast<AllocaInst>(V);
|
||||
for (const Value *V : Allocas) {
|
||||
const AllocaInst *AI = dyn_cast<AllocaInst>(V);
|
||||
if (!AI)
|
||||
continue;
|
||||
|
||||
|
@ -541,16 +541,16 @@ static bool isDependenceBarrier(MachineInstr &MI, AliasAnalysis *AA) {
|
||||
/// Return the underlying objects for the memory references of an instruction.
|
||||
/// This function calls the code in ValueTracking, but first checks that the
|
||||
/// instruction has a memory operand.
|
||||
static void getUnderlyingObjects(MachineInstr *MI,
|
||||
SmallVectorImpl<Value *> &Objs,
|
||||
static void getUnderlyingObjects(const MachineInstr *MI,
|
||||
SmallVectorImpl<const Value *> &Objs,
|
||||
const DataLayout &DL) {
|
||||
if (!MI->hasOneMemOperand())
|
||||
return;
|
||||
MachineMemOperand *MM = *MI->memoperands_begin();
|
||||
if (!MM->getValue())
|
||||
return;
|
||||
GetUnderlyingObjects(const_cast<Value *>(MM->getValue()), Objs, DL);
|
||||
for (Value *V : Objs) {
|
||||
GetUnderlyingObjects(MM->getValue(), Objs, DL);
|
||||
for (const Value *V : Objs) {
|
||||
if (!isIdentifiedObject(V)) {
|
||||
Objs.clear();
|
||||
return;
|
||||
@ -564,7 +564,7 @@ static void getUnderlyingObjects(MachineInstr *MI,
|
||||
/// dependence. This code is very similar to the code in ScheduleDAGInstrs
|
||||
/// but that code doesn't create loop carried dependences.
|
||||
void SwingSchedulerDAG::addLoopCarriedDependences(AliasAnalysis *AA) {
|
||||
MapVector<Value *, SmallVector<SUnit *, 4>> PendingLoads;
|
||||
MapVector<const Value *, SmallVector<SUnit *, 4>> PendingLoads;
|
||||
Value *UnknownValue =
|
||||
UndefValue::get(Type::getVoidTy(MF.getFunction().getContext()));
|
||||
for (auto &SU : SUnits) {
|
||||
@ -572,7 +572,7 @@ void SwingSchedulerDAG::addLoopCarriedDependences(AliasAnalysis *AA) {
|
||||
if (isDependenceBarrier(MI, AA))
|
||||
PendingLoads.clear();
|
||||
else if (MI.mayLoad()) {
|
||||
SmallVector<Value *, 4> Objs;
|
||||
SmallVector<const Value *, 4> Objs;
|
||||
getUnderlyingObjects(&MI, Objs, MF.getDataLayout());
|
||||
if (Objs.empty())
|
||||
Objs.push_back(UnknownValue);
|
||||
@ -581,12 +581,12 @@ void SwingSchedulerDAG::addLoopCarriedDependences(AliasAnalysis *AA) {
|
||||
SUs.push_back(&SU);
|
||||
}
|
||||
} else if (MI.mayStore()) {
|
||||
SmallVector<Value *, 4> Objs;
|
||||
SmallVector<const Value *, 4> Objs;
|
||||
getUnderlyingObjects(&MI, Objs, MF.getDataLayout());
|
||||
if (Objs.empty())
|
||||
Objs.push_back(UnknownValue);
|
||||
for (auto V : Objs) {
|
||||
MapVector<Value *, SmallVector<SUnit *, 4>>::iterator I =
|
||||
MapVector<const Value *, SmallVector<SUnit *, 4>>::iterator I =
|
||||
PendingLoads.find(V);
|
||||
if (I == PendingLoads.end())
|
||||
continue;
|
||||
|
@ -6463,12 +6463,12 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
const int64_t ObjectSize =
|
||||
cast<ConstantInt>(I.getArgOperand(0))->getSExtValue();
|
||||
Value *const ObjectPtr = I.getArgOperand(1);
|
||||
SmallVector<Value *, 4> Allocas;
|
||||
SmallVector<const Value *, 4> Allocas;
|
||||
GetUnderlyingObjects(ObjectPtr, Allocas, *DL);
|
||||
|
||||
for (SmallVectorImpl<Value*>::iterator Object = Allocas.begin(),
|
||||
for (SmallVectorImpl<const Value*>::iterator Object = Allocas.begin(),
|
||||
E = Allocas.end(); Object != E; ++Object) {
|
||||
AllocaInst *LifetimeObject = dyn_cast_or_null<AllocaInst>(*Object);
|
||||
const AllocaInst *LifetimeObject = dyn_cast_or_null<AllocaInst>(*Object);
|
||||
|
||||
// Could not find an Alloca.
|
||||
if (!LifetimeObject)
|
||||
|
@ -540,10 +540,10 @@ getUnderlyingObjects(const MachineInstr &MI,
|
||||
|
||||
const Value *V = (*MI.memoperands_begin())->getValue();
|
||||
|
||||
SmallVector<Value *, 4> Objs;
|
||||
GetUnderlyingObjects(const_cast<Value *>(V), Objs, DL);
|
||||
SmallVector<const Value *, 4> Objs;
|
||||
GetUnderlyingObjects(V, Objs, DL);
|
||||
|
||||
for (SmallVectorImpl<Value *>::iterator I = Objs.begin(), E = Objs.end();
|
||||
for (SmallVectorImpl<const Value *>::iterator I = Objs.begin(), E = Objs.end();
|
||||
I != E; ++I) {
|
||||
if (!isIdentifiedObject(V))
|
||||
return false;
|
||||
|
@ -701,11 +701,11 @@ static bool canLowerToLDG(MemSDNode *N, const NVPTXSubtarget &Subtarget,
|
||||
// We use GetUnderlyingObjects() here instead of GetUnderlyingObject() mainly
|
||||
// because the former looks through phi nodes while the latter does not. We
|
||||
// need to look through phi nodes to handle pointer induction variables.
|
||||
SmallVector<Value *, 8> Objs;
|
||||
GetUnderlyingObjects(const_cast<Value *>(N->getMemOperand()->getValue()),
|
||||
SmallVector<const Value *, 8> Objs;
|
||||
GetUnderlyingObjects(N->getMemOperand()->getValue(),
|
||||
Objs, F->getDataLayout());
|
||||
|
||||
return all_of(Objs, [&](Value *V) {
|
||||
return all_of(Objs, [&](const Value *V) {
|
||||
if (auto *A = dyn_cast<const Argument>(V))
|
||||
return IsKernelFn && A->onlyReadsMemory() && A->hasNoAliasAttr();
|
||||
if (auto *GV = dyn_cast<const GlobalVariable>(V))
|
||||
|
@ -1190,10 +1190,10 @@ Value *DFSanFunction::loadShadow(Value *Addr, uint64_t Size, uint64_t Align,
|
||||
}
|
||||
|
||||
uint64_t ShadowAlign = Align * DFS.ShadowWidth / 8;
|
||||
SmallVector<Value *, 2> Objs;
|
||||
SmallVector<const Value *, 2> Objs;
|
||||
GetUnderlyingObjects(Addr, Objs, Pos->getModule()->getDataLayout());
|
||||
bool AllConstants = true;
|
||||
for (Value *Obj : Objs) {
|
||||
for (const Value *Obj : Objs) {
|
||||
if (isa<Function>(Obj) || isa<BlockAddress>(Obj))
|
||||
continue;
|
||||
if (isa<GlobalVariable>(Obj) && cast<GlobalVariable>(Obj)->isConstant())
|
||||
|
@ -99,7 +99,7 @@ static void
|
||||
deleteDeadInstruction(Instruction *I, BasicBlock::iterator *BBI,
|
||||
MemoryDependenceResults &MD, const TargetLibraryInfo &TLI,
|
||||
InstOverlapIntervalsTy &IOL, OrderedBasicBlock &OBB,
|
||||
SmallSetVector<Value *, 16> *ValueSet = nullptr) {
|
||||
SmallSetVector<const Value *, 16> *ValueSet = nullptr) {
|
||||
SmallVector<Instruction*, 32> NowDeadInsts;
|
||||
|
||||
NowDeadInsts.push_back(I);
|
||||
@ -713,7 +713,7 @@ static bool handleFree(CallInst *F, AliasAnalysis *AA,
|
||||
/// the DeadStackObjects set. If so, they become live because the location is
|
||||
/// being loaded.
|
||||
static void removeAccessedObjects(const MemoryLocation &LoadedLoc,
|
||||
SmallSetVector<Value *, 16> &DeadStackObjects,
|
||||
SmallSetVector<const Value *, 16> &DeadStackObjects,
|
||||
const DataLayout &DL, AliasAnalysis *AA,
|
||||
const TargetLibraryInfo *TLI,
|
||||
const Function *F) {
|
||||
@ -726,12 +726,12 @@ static void removeAccessedObjects(const MemoryLocation &LoadedLoc,
|
||||
// If the kill pointer can be easily reduced to an alloca, don't bother doing
|
||||
// extraneous AA queries.
|
||||
if (isa<AllocaInst>(UnderlyingPointer) || isa<Argument>(UnderlyingPointer)) {
|
||||
DeadStackObjects.remove(const_cast<Value*>(UnderlyingPointer));
|
||||
DeadStackObjects.remove(UnderlyingPointer);
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove objects that could alias LoadedLoc.
|
||||
DeadStackObjects.remove_if([&](Value *I) {
|
||||
DeadStackObjects.remove_if([&](const Value *I) {
|
||||
// See if the loaded location could alias the stack location.
|
||||
MemoryLocation StackLoc(I, getPointerSize(I, DL, *TLI, F));
|
||||
return !AA->isNoAlias(StackLoc, LoadedLoc);
|
||||
@ -753,7 +753,7 @@ static bool handleEndBlock(BasicBlock &BB, AliasAnalysis *AA,
|
||||
|
||||
// Keep track of all of the stack objects that are dead at the end of the
|
||||
// function.
|
||||
SmallSetVector<Value*, 16> DeadStackObjects;
|
||||
SmallSetVector<const Value*, 16> DeadStackObjects;
|
||||
|
||||
// Find all of the alloca'd pointers in the entry block.
|
||||
BasicBlock &Entry = BB.getParent()->front();
|
||||
@ -782,12 +782,12 @@ static bool handleEndBlock(BasicBlock &BB, AliasAnalysis *AA,
|
||||
// If we find a store, check to see if it points into a dead stack value.
|
||||
if (hasAnalyzableMemoryWrite(&*BBI, *TLI) && isRemovable(&*BBI)) {
|
||||
// See through pointer-to-pointer bitcasts
|
||||
SmallVector<Value *, 4> Pointers;
|
||||
SmallVector<const Value *, 4> Pointers;
|
||||
GetUnderlyingObjects(getStoredPointerOperand(&*BBI), Pointers, DL);
|
||||
|
||||
// Stores to stack values are valid candidates for removal.
|
||||
bool AllDead = true;
|
||||
for (Value *Pointer : Pointers)
|
||||
for (const Value *Pointer : Pointers)
|
||||
if (!DeadStackObjects.count(Pointer)) {
|
||||
AllDead = false;
|
||||
break;
|
||||
@ -798,7 +798,8 @@ static bool handleEndBlock(BasicBlock &BB, AliasAnalysis *AA,
|
||||
|
||||
LLVM_DEBUG(dbgs() << "DSE: Dead Store at End of Block:\n DEAD: "
|
||||
<< *Dead << "\n Objects: ";
|
||||
for (SmallVectorImpl<Value *>::iterator I = Pointers.begin(),
|
||||
for (SmallVectorImpl<const Value *>::iterator I =
|
||||
Pointers.begin(),
|
||||
E = Pointers.end();
|
||||
I != E; ++I) {
|
||||
dbgs() << **I;
|
||||
@ -847,7 +848,7 @@ static bool handleEndBlock(BasicBlock &BB, AliasAnalysis *AA,
|
||||
|
||||
// If the call might load from any of our allocas, then any store above
|
||||
// the call is live.
|
||||
DeadStackObjects.remove_if([&](Value *I) {
|
||||
DeadStackObjects.remove_if([&](const Value *I) {
|
||||
// See if the call site touches the value.
|
||||
return isRefSet(AA->getModRefInfo(
|
||||
Call, I, getPointerSize(I, DL, *TLI, BB.getParent())));
|
||||
|
@ -1041,11 +1041,10 @@ static void AddAliasScopeMetadata(CallSite CS, ValueToValueMapTy &VMap,
|
||||
|
||||
SmallSetVector<const Argument *, 4> NAPtrArgs;
|
||||
for (const Value *V : PtrArgs) {
|
||||
SmallVector<Value *, 4> Objects;
|
||||
GetUnderlyingObjects(const_cast<Value*>(V),
|
||||
Objects, DL, /* LI = */ nullptr);
|
||||
SmallVector<const Value *, 4> Objects;
|
||||
GetUnderlyingObjects(V, Objects, DL, /* LI = */ nullptr);
|
||||
|
||||
for (Value *O : Objects)
|
||||
for (const Value *O : Objects)
|
||||
ObjSet.insert(O);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user