diff options
Diffstat (limited to 'llvm/lib/Analysis/LoopAccessAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/LoopAccessAnalysis.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp index 980f142..3f18972 100644 --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -2449,13 +2449,20 @@ bool LoopAccessInfo::analyzeLoop(AAResults *AA, const LoopInfo *LI, continue; // If this is a load, save it. If this instruction can read from memory - // but is not a load, then we quit. Notice that we don't handle function - // calls that read or write. + // but is not a load, we only allow it if it's a call to a function with a + // vector mapping and no pointer arguments. if (I.mayReadFromMemory()) { - // If the function has an explicit vectorized counterpart, we can safely - // assume that it can be vectorized. + auto hasPointerArgs = [](CallBase *CB) { + return any_of(CB->args(), [](Value const *Arg) { + return Arg->getType()->isPointerTy(); + }); + }; + + // If the function has an explicit vectorized counterpart, and does not + // take output/input pointers, we can safely assume that it can be + // vectorized. if (Call && !Call->isNoBuiltin() && Call->getCalledFunction() && - !VFDatabase::getMappings(*Call).empty()) + !hasPointerArgs(Call) && !VFDatabase::getMappings(*Call).empty()) continue; auto *Ld = dyn_cast<LoadInst>(&I); |