mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
[LV] Use getPointerOperand helper where appropriate (NFC)
llvm-svn: 277375
This commit is contained in:
parent
97022d6a05
commit
a7ed75f1b5
@ -270,6 +270,16 @@ static GetElementPtrInst *getGEPInstruction(Value *Ptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// A helper function that returns the pointer operand of a load or store
|
||||
/// instruction.
|
||||
static Value *getPointerOperand(Value *I) {
|
||||
if (auto *LI = dyn_cast<LoadInst>(I))
|
||||
return LI->getPointerOperand();
|
||||
if (auto *SI = dyn_cast<StoreInst>(I))
|
||||
return SI->getPointerOperand();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// InnerLoopVectorizer vectorizes loops which contain only one basic
|
||||
/// block to a specified vectorization factor (VF).
|
||||
/// This class performs the widening of scalars into vectors, or multiple
|
||||
@ -2335,7 +2345,7 @@ void InnerLoopVectorizer::vectorizeInterleaveGroup(Instruction *Instr) {
|
||||
|
||||
LoadInst *LI = dyn_cast<LoadInst>(Instr);
|
||||
StoreInst *SI = dyn_cast<StoreInst>(Instr);
|
||||
Value *Ptr = LI ? LI->getPointerOperand() : SI->getPointerOperand();
|
||||
Value *Ptr = getPointerOperand(Instr);
|
||||
|
||||
// Prepare for the vector type of the interleaved load/store.
|
||||
Type *ScalarTy = LI ? LI->getType() : SI->getValueOperand()->getType();
|
||||
@ -2459,7 +2469,7 @@ void InnerLoopVectorizer::vectorizeMemoryInstruction(Instruction *Instr) {
|
||||
|
||||
Type *ScalarDataTy = LI ? LI->getType() : SI->getValueOperand()->getType();
|
||||
Type *DataTy = VectorType::get(ScalarDataTy, VF);
|
||||
Value *Ptr = LI ? LI->getPointerOperand() : SI->getPointerOperand();
|
||||
Value *Ptr = getPointerOperand(Instr);
|
||||
unsigned Alignment = LI ? LI->getAlignment() : SI->getAlignment();
|
||||
// An alignment of 0 means target abi alignment. We need to use the scalar's
|
||||
// target abi alignment in such a case.
|
||||
@ -4433,12 +4443,9 @@ bool LoopVectorizationLegality::canVectorizeWithIfConvert() {
|
||||
if (blockNeedsPredication(BB))
|
||||
continue;
|
||||
|
||||
for (Instruction &I : *BB) {
|
||||
if (auto *LI = dyn_cast<LoadInst>(&I))
|
||||
SafePointes.insert(LI->getPointerOperand());
|
||||
else if (auto *SI = dyn_cast<StoreInst>(&I))
|
||||
SafePointes.insert(SI->getPointerOperand());
|
||||
}
|
||||
for (Instruction &I : *BB)
|
||||
if (auto *Ptr = getPointerOperand(&I))
|
||||
SafePointes.insert(Ptr);
|
||||
}
|
||||
|
||||
// Collect the blocks that need predication.
|
||||
@ -5035,7 +5042,7 @@ void InterleavedAccessInfo::collectConstStrideAccesses(
|
||||
if (!LI && !SI)
|
||||
continue;
|
||||
|
||||
Value *Ptr = LI ? LI->getPointerOperand() : SI->getPointerOperand();
|
||||
Value *Ptr = getPointerOperand(&I);
|
||||
int64_t Stride = getPtrStride(PSE, Ptr, TheLoop, Strides);
|
||||
|
||||
const SCEV *Scev = replaceSymbolicStrideSCEV(PSE, Strides, Ptr);
|
||||
@ -6021,7 +6028,7 @@ unsigned LoopVectorizationCostModel::getInstructionCost(Instruction *I,
|
||||
unsigned Alignment = SI ? SI->getAlignment() : LI->getAlignment();
|
||||
unsigned AS =
|
||||
SI ? SI->getPointerAddressSpace() : LI->getPointerAddressSpace();
|
||||
Value *Ptr = SI ? SI->getPointerOperand() : LI->getPointerOperand();
|
||||
Value *Ptr = getPointerOperand(I);
|
||||
// We add the cost of address computation here instead of with the gep
|
||||
// instruction because only here we know whether the operation is
|
||||
// scalarized.
|
||||
@ -6233,27 +6240,14 @@ Pass *createLoopVectorizePass(bool NoUnrolling, bool AlwaysVectorize) {
|
||||
}
|
||||
|
||||
bool LoopVectorizationCostModel::isConsecutiveLoadOrStore(Instruction *Inst) {
|
||||
// Check for a store.
|
||||
if (auto *ST = dyn_cast<StoreInst>(Inst))
|
||||
return Legal->isConsecutivePtr(ST->getPointerOperand()) != 0;
|
||||
|
||||
// Check for a load.
|
||||
if (auto *LI = dyn_cast<LoadInst>(Inst))
|
||||
return Legal->isConsecutivePtr(LI->getPointerOperand()) != 0;
|
||||
|
||||
// Check if the pointer operand of a load or store instruction is
|
||||
// consecutive.
|
||||
if (auto *Ptr = getPointerOperand(Inst))
|
||||
return Legal->isConsecutivePtr(Ptr);
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Take the pointer operand from the Load/Store instruction.
|
||||
/// Returns NULL if this is not a valid Load/Store instruction.
|
||||
static Value *getPointerOperand(Value *I) {
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(I))
|
||||
return LI->getPointerOperand();
|
||||
if (StoreInst *SI = dyn_cast<StoreInst>(I))
|
||||
return SI->getPointerOperand();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void LoopVectorizationCostModel::collectValuesToIgnore() {
|
||||
// Ignore ephemeral values.
|
||||
CodeMetrics::collectEphemeralValues(TheLoop, AC, ValuesToIgnore);
|
||||
|
Loading…
Reference in New Issue
Block a user