[PATCH] D82550: [SLPVectorizer] handle vectorized lib functions
Sanne Wouda via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 25 08:34:31 PDT 2020
sanwou01 updated this revision to Diff 273383.
sanwou01 marked 8 inline comments as done.
sanwou01 added a comment.
Addressed comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D82550/new/
https://reviews.llvm.org/D82550
Files:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
Index: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -3022,19 +3022,24 @@
return;
}
case Instruction::Call: {
- // Check if the calls are all to the same vectorizable intrinsic.
+ // Check if the calls are all to the same vectorizable intrinsic or
+ // library function.
CallInst *CI = cast<CallInst>(VL0);
- // Check if this is an Intrinsic call or something that can be
- // represented by an intrinsic call
Intrinsic::ID ID = getVectorIntrinsicIDForCall(CI, TLI);
- if (!isTriviallyVectorizable(ID)) {
+
+ auto Shape =
+ VFShape::get(*CI, {static_cast<unsigned int>(VL.size()), false},
+ false /*HasGlobalPred*/);
+ Function *VecFunc = VFDatabase(*CI).getVectorizedFunction(Shape);
+
+ if (!VecFunc && !isTriviallyVectorizable(ID)) {
BS.cancelScheduling(VL, VL0);
newTreeEntry(VL, None /*not vectorized*/, S, UserTreeIdx,
ReuseShuffleIndicies);
LLVM_DEBUG(dbgs() << "SLP: Non-vectorizable call.\n");
return;
}
- Function *Int = CI->getCalledFunction();
+ Function *F = CI->getCalledFunction();
unsigned NumArgs = CI->getNumArgOperands();
SmallVector<Value*, 4> ScalarArgs(NumArgs, nullptr);
for (unsigned j = 0; j != NumArgs; ++j)
@@ -3042,8 +3047,10 @@
ScalarArgs[j] = CI->getArgOperand(j);
for (Value *V : VL) {
CallInst *CI2 = dyn_cast<CallInst>(V);
- if (!CI2 || CI2->getCalledFunction() != Int ||
+ if (!CI2 || CI2->getCalledFunction() != F ||
getVectorIntrinsicIDForCall(CI2, TLI) != ID ||
+ (VecFunc &&
+ VecFunc != VFDatabase(*CI2).getVectorizedFunction(Shape)) ||
!CI->hasIdenticalOperandBundleSchema(*CI2)) {
BS.cancelScheduling(VL, VL0);
newTreeEntry(VL, None /*not vectorized*/, S, UserTreeIdx,
@@ -4507,7 +4514,8 @@
Intrinsic::ID ID = getVectorIntrinsicIDForCall(CI, TLI);
auto VecCallCosts = getVectorCallCosts(CI, VecTy, TTI, TLI);
- bool UseIntrinsic = VecCallCosts.first <= VecCallCosts.second;
+ bool UseIntrinsic = ID != Intrinsic::not_intrinsic &&
+ VecCallCosts.first <= VecCallCosts.second;
Value *ScalarArg = nullptr;
std::vector<Value *> OpVecs;
@@ -4527,15 +4535,16 @@
OpVecs.push_back(OpVec);
}
- Module *M = F->getParent();
- Type *Tys[] = {FixedVectorType::get(CI->getType(), E->Scalars.size())};
- Function *CF = Intrinsic::getDeclaration(M, ID, Tys);
-
+ Function *CF;
if (!UseIntrinsic) {
VFShape Shape = VFShape::get(
*CI, {static_cast<unsigned>(VecTy->getNumElements()), false},
false /*HasGlobalPred*/);
CF = VFDatabase(*CI).getVectorizedFunction(Shape);
+ } else {
+ Module *M = F->getParent();
+ Type *Tys[] = {FixedVectorType::get(CI->getType(), E->Scalars.size())};
+ CF = Intrinsic::getDeclaration(M, ID, Tys);
}
SmallVector<OperandBundleDef, 1> OpBundles;
@@ -5086,6 +5095,12 @@
return II && II->getIntrinsicID() == Intrinsic::sideeffect;
}
+static bool isVectorizableLibFunctionCall(Instruction *I) {
+ auto *CI = dyn_cast<CallInst>(I);
+
+ return CI && !VFDatabase::getMappings(*CI).empty();
+}
+
void BoUpSLP::BlockScheduling::initScheduleData(Instruction *FromI,
Instruction *ToI,
ScheduleData *PrevLoadStore,
@@ -5102,7 +5117,8 @@
"new ScheduleData already in scheduling region");
SD->init(SchedulingRegionID, I);
- if (I->mayReadOrWriteMemory() && !isSideeffectIntrinsic(I)) {
+ if (I->mayReadOrWriteMemory() && !isSideeffectIntrinsic(I) &&
+ !isVectorizableLibFunctionCall(I)) {
// Update the linked list of memory accessing instructions.
if (CurrentLoadStore) {
CurrentLoadStore->NextLoadStore = SD;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D82550.273383.patch
Type: text/x-patch
Size: 4203 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200625/dbcc80e6/attachment.bin>
More information about the llvm-commits
mailing list