aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/LoopAccessAnalysis.cpp
AgeCommit message (Collapse)AuthorFilesLines
2016-08-31Fix indent. NFC.Chad Rosier1-2/+2
llvm-svn: 280270
2016-08-28[Loop Vectorizer] Fixed memory confilict checks.Elena Demikhovsky1-3/+29
Fixed a bug in run-time checks for possible memory conflicts inside loop. The bug is in Low <-> High boundaries calculation. The High boundary should be calculated as "last memory access pointer + element size". Differential revision: https://reviews.llvm.org/D23176 llvm-svn: 279930
2016-08-12Use the range variant of transform instead of unpacking begin/endDavid Majnemer1-4/+3
No functionality change is intended. llvm-svn: 278476
2016-08-09Consistently use LoopAnalysisManagerSean Silva1-2/+2
One exception here is LoopInfo which must forward-declare it (because the typedef is in LoopPassManager.h which depends on LoopInfo). Also, some includes for LoopPassManager.h were needed since that file provides the typedef. Besides a general consistently benefit, the extra layer of indirection allows the mechanical part of https://reviews.llvm.org/D23256 that requires touching every transformation and analysis to be factored out cleanly. Thanks to David for the suggestion. llvm-svn: 278079
2016-08-09Consistently use FunctionAnalysisManagerSean Silva1-1/+1
Besides a general consistently benefit, the extra layer of indirection allows the mechanical part of https://reviews.llvm.org/D23256 that requires touching every transformation and analysis to be factored out cleanly. Thanks to David for the suggestion. llvm-svn: 278077
2016-08-04[LV, X86] Be more optimistic about vectorizing shifts.Michael Kuperstein1-1/+8
Shifts with a uniform but non-constant count were considered very expensive to vectorize, because the splat of the uniform count and the shift would tend to appear in different blocks. That made the splat invisible to ISel, and we'd scalarize the shift at codegen time. Since r201655, CodeGenPrepare sinks those splats to be next to their use, and we are able to select the appropriate vector shifts. This updates the cost model to to take this into account by making shifts by a uniform cheap again. Differential Revision: https://reviews.llvm.org/D23049 llvm-svn: 277782
2016-07-20[OptDiag,LV] Add hotness attribute to analysis remarksAdam Nemet1-7/+8
The earlier change added hotness attribute to missed-optimization remarks. This follows up with the analysis remarks (the ones explaining the reason for the missed optimization). llvm-svn: 276192
2016-07-13[LAA] Don't hold on to DominatorTree in the analysis resultAdam Nemet1-4/+5
llvm-svn: 275335
2016-07-13[LAA] Don't hold on to TargetLibraryInfo in the analysis resultAdam Nemet1-3/+4
llvm-svn: 275334
2016-07-13[LAA] Don't hold on to DataLayout in the analysis resultAdam Nemet1-11/+8
In fact, don't even pass this to the ctor since we can get it from the module. llvm-svn: 275326
2016-07-13[LAA] Don't hold on to LoopInfo in the analysis resultAdam Nemet1-3/+3
llvm-svn: 275325
2016-07-13[LAA] Don't hold on to AliasAnalysis in the analysis resultAdam Nemet1-3/+3
llvm-svn: 275322
2016-07-12[LoopAccessAnalysis] Some minor cleanupsDavid Majnemer1-20/+16
Use range-base for loops. Use auto when appropriate. No functional change is intended. llvm-svn: 275213
2016-07-08[PM] name the new PM LAA class LoopAccessAnalysis (LAA) /NFCXinliang David Li1-3/+3
llvm-svn: 274934
2016-07-08Rename LoopAccessAnalysis to LoopAccessLegacyAnalysis /NFCXinliang David Li1-9/+9
llvm-svn: 274927
2016-07-07[LoopAccessAnalysis] Fix an integer overflowDavid Majnemer1-22/+22
We were inappropriately using 32-bit types to account for quantities that can be far larger. Fixed in PR28443. llvm-svn: 274737
2016-07-07[PM] Avoid getResult on a higher level in LoopAccessAnalysisSean Silva1-7/+15
Note that require<domtree> and require<loops> aren't needed because they come in implicitly via the loop pass manager. llvm-svn: 274712
2016-07-02[PM] Port LoopAccessInfo analysis to new PMXinliang David Li1-0/+28
It is implemented as a LoopAnalysis pass as discussed and agreed upon. llvm-svn: 274452
2016-07-01[PM] refactor LoopAccessInfo code part-2Xinliang David Li1-15/+15
Differential Revision: http://reviews.llvm.org/D21636 llvm-svn: 274334
2016-07-01[LAA] Fix alphabetical sorting of headers. NFCAdam Nemet1-1/+1
llvm-svn: 274302
2016-06-29Reverted patch 273864Elena Demikhovsky1-4/+4
llvm-svn: 274115
2016-06-27Fixed consecutive memory access detection in Loop Vectorizer.Elena Demikhovsky1-4/+4
It did not handle correctly cases without GEP. The following loop wasn't vectorized: for (int i=0; i<len; i++) *to++ = *from++; I use getPtrStride() to find Stride for memory access and return 0 is the Stride is not 1 or -1. Re-commit rL273257 - revision: http://reviews.llvm.org/D20789 llvm-svn: 273864
2016-06-22[PM]: LoopAccessInfo simple refactoringXinliang David Li1-22/+24
To make definition of mov ctors easier. Differential Revision: http://reviews.llvm.org/D21563 llvm-svn: 273506
2016-06-21reverted the prev commit due to assertion failureElena Demikhovsky1-4/+4
llvm-svn: 273258
2016-06-21Fixed consecutive memory access detection in Loop Vectorizer.Elena Demikhovsky1-4/+4
It did not handle correctly cases without GEP. The following loop wasn't vectorized: for (int i=0; i<len; i++) *to++ = *from++; I use getPtrStride() to find Stride for memory access and return 0 is the Stride is not 1 or -1. Differential revision: http://reviews.llvm.org/D20789 llvm-svn: 273257
2016-06-17[LAA] Enable symbolic stride speculation for all LAA clientsAdam Nemet1-16/+22
This is a functional change for LLE and LDist. The other clients (LV, LVerLICM) already had this explicitly enabled. The temporary boolean parameter to LAA is removed that allowed turning off speculation of symbolic strides. This makes LAA's caching interface LAA::getInfo only take the loop as the parameter. This makes the interface more friendly to the new Pass Manager. The flag -enable-mem-access-versioning is moved from LV to a LAA which now allows turning off speculation globally. llvm-svn: 273064
2016-06-16[LV] Move management of symbolic strides to LAA. NFCIAdam Nemet1-13/+33
This is still NFCI, so the list of clients that allow symbolic stride speculation does not change (yes: LV and LoopVersioningLICM, no: LLE, LDist). However since the symbolic strides are now managed by LAA rather than passed by client a new bool parameter is used to enable symbolic stride speculation. The existing test Transforms/LoopVectorize/version-mem-access.ll checks that stride speculation is performed for LV. The previously added test Transforms/LoopLoadElim/symbolic-stride.ll ensures that no speculation is performed for LLE. The next patch will change the functionality and turn on symbolic stride speculation in all of LAA's clients and remove the bool parameter. llvm-svn: 272970
2016-06-16[LAA] Rename Strides to SymblicStrides in analyzeLoop. NFCAdam Nemet1-7/+8
This is to facilitate to move of SymblicStrides from LV to LAA. llvm-svn: 272879
2016-06-16[LAA] Default getInfo to not speculate symbolic strides. NFCAdam Nemet1-3/+1
Soon we won't be passing Strides to getInfo and then we'll have fewer call sites to update. llvm-svn: 272878
2016-06-09Revert r272194 No need for it if loop Analysis Manager is usedXinliang David Li1-11/+12
llvm-svn: 272243
2016-06-08[PM] Refector LoopAccessInfo analysis code Xinliang David Li1-12/+11
This is the preparation patch to port the analysis to new PM Differential Revision: http://reviews.llvm.org/D20560 llvm-svn: 272194
2016-06-07[LAA] Improve non-wrapping pointer detection by handling loop-invariant case.Andrey Turetskiy1-4/+14
This fixes PR26314. This patch adds new helper “isNoWrap” with detection of loop-invariant pointer case. Patch by Roman Shirokiy. Ref: https://llvm.org/bugs/show_bug.cgi?id=26314 Differential Revision: http://reviews.llvm.org/D17268 llvm-svn: 272014
2016-06-06[LAA] Use load and store vectors (NFC)Matthew Simpson1-11/+7
Contributed-by: Aditya Kumar <hiraditya@msn.com> Differential Revision: http://reviews.llvm.org/D20953 llvm-svn: 271895
2016-05-19[LAA] Check independence of strided accesses before forward caseMatthew Simpson1-10/+11
This patch changes the order in which we attempt to prove the independence of strided accesses. We previously did this after we knew the dependence distance was positive. With this change, we check for independence before handling the negative distance case. The patch prevents LAA from reporting forward dependences for independent strided accesses. This change was requested in the review of D19984. llvm-svn: 270072
2016-05-16[LAA] Rename forwarding conflict detection option (NFC)Matthew Simpson1-6/+6
This patch renames the option enabling the store-to-load forwarding conflict detection optimization. This change was requested in the review of D20241. llvm-svn: 269668
2016-05-16[LAA] Comment couldPreventStoreLoadForward. NFCAdam Nemet1-2/+8
Also s/Cycles/Iters/ in NumCyclesForStoreLoadThroughMemory to make it clear that this is not about clock cycles but loop cycles/iterations. llvm-svn: 269667
2016-05-16[LAA] clang-format the function couldPreventStoreLoadForward. NFCAdam Nemet1-9/+9
llvm-svn: 269666
2016-05-16[LAA] Add option to disable conflict detection (NFC)Matthew Simpson1-2/+9
llvm-svn: 269654
2016-05-13[LAA] Include MaxSafeDepDistBytes in the analysis print-outAdam Nemet1-0/+3
llvm-svn: 269508
2016-05-13[LAA] Prepare the code to print more things in the summary. NFCAdam Nemet1-3/+3
llvm-svn: 269507
2016-05-12[LAA] Use std::min. NFCAdam Nemet1-4/+2
llvm-svn: 269356
2016-05-10[LAA] Use re-written SCEV expressions when computing distancesSilviu Baranga1-7/+2
This removes a redundant stride versioning step (we already do it in getPtrStride, so it has no effect) and uses PSE to get the SCEV expressions for the source and destination (this might have changed when getPtrStride was called). I discovered this through code inspection, and couldn't produce a regression test for it. llvm-svn: 269052
2016-05-10[LAA] Rename "isStridedPtr" with "getPtrStride". NFC.Denis Zobnin1-5/+5
Changing misleading function name was approved in http://reviews.llvm.org/D17268. Patch by Roman Shirokiy. llvm-svn: 269021
2016-05-09[LV] Hint at the new loop distribution pragma in optimization remarkAdam Nemet1-2/+6
When we encounter unsafe memory dependencies, loop distribution could help. Even though, the diagnostics is in LAA, it's only currently emitted in the vectorizer. llvm-svn: 268987
2016-05-05[LAA] Fix confusing debug messageAdam Nemet1-1/+1
This message used to be correct, when all we cared about was whether the dependence was safe (i.e. NoDep) or unsafe. With the current more precise characterization, this is a forward dep. llvm-svn: 268695
2016-04-19[ValueTracking, VectorUtils] Refactor getIntrinsicIDForCallDavid Majnemer1-1/+1
The functionality contained within getIntrinsicIDForCall is two-fold: it checks if a CallInst's callee is a vectorizable intrinsic. If it isn't an intrinsic, it attempts to map the call's target to a suitable intrinsic. Move the mapping functionality into getIntrinsicForCallSite and rename getIntrinsicIDForCall to getVectorIntrinsicIDForCall while reimplementing it in terms of getIntrinsicForCallSite. llvm-svn: 266801
2016-04-14[SCEV][LAA] Add tests for SCEV expression transformations performed during LAASilviu Baranga1-0/+5
Summary: Add a print method to Predicated Scalar Evolution which prints all interesting transformations done by PSE. Loop Access Analysis will now print this as part of the analysis output. We now use this to check the exact expression transformations that were done by PSE in LAA. The additional checking also acts as white-box testing for the getAsAddRec method. Reviewers: anemet, sanjoy Subscribers: sanjoy, mzolotukhin, llvm-commits Differential Revision: http://reviews.llvm.org/D18792 llvm-svn: 266334
2016-04-08Re-commit [SCEV] Introduce a guarded backedge taken count and use it in LAA ↵Silviu Baranga1-2/+2
and LV This re-commits r265535 which was reverted in r265541 because it broke the windows bots. The problem was that we had a PointerIntPair which took a pointer to a struct allocated with new. The problem was that new doesn't provide sufficient alignment guarantees. This pattern was already present before r265535 and it just happened to work. To fix this, we now separate the PointerToIntPair from the ExitNotTakenInfo struct into a pointer and a bool. Original commit message: Summary: When the backedge taken codition is computed from an icmp, SCEV can deduce the backedge taken count only if one of the sides of the icmp is an AddRecExpr. However, due to sign/zero extensions, we sometimes end up with something that is not an AddRecExpr. However, we can use SCEV predicates to produce a 'guarded' expression. This change adds a method to SCEV to get this expression, and the SCEV predicate associated with it. In HowManyGreaterThans and HowManyLessThans we will now add a SCEV predicate associated with the guarded backedge taken count when the analyzed SCEV expression is not an AddRecExpr. Note that we only do this as an alternative to returning a 'CouldNotCompute'. We use new feature in Loop Access Analysis and LoopVectorize to analyze and transform more loops. Reviewers: anemet, mzolotukhin, hfinkel, sanjoy Subscribers: flyingforyou, mcrosier, atrick, mssimpso, sanjoy, mzolotukhin, llvm-commits Differential Revision: http://reviews.llvm.org/D17201 llvm-svn: 265786
2016-04-06Revert r265535 until we know how we can fix the bots Silviu Baranga1-2/+2
llvm-svn: 265541
2016-04-06[SCEV] Introduce a guarded backedge taken count and use it in LAA and LVSilviu Baranga1-2/+2
Summary: When the backedge taken codition is computed from an icmp, SCEV can deduce the backedge taken count only if one of the sides of the icmp is an AddRecExpr. However, due to sign/zero extensions, we sometimes end up with something that is not an AddRecExpr. However, we can use SCEV predicates to produce a 'guarded' expression. This change adds a method to SCEV to get this expression, and the SCEV predicate associated with it. In HowManyGreaterThans and HowManyLessThans we will now add a SCEV predicate associated with the guarded backedge taken count when the analyzed SCEV expression is not an AddRecExpr. Note that we only do this as an alternative to returning a 'CouldNotCompute'. We use new feature in Loop Access Analysis and LoopVectorize to analyze and transform more loops. Reviewers: anemet, mzolotukhin, hfinkel, sanjoy Subscribers: flyingforyou, mcrosier, atrick, mssimpso, sanjoy, mzolotukhin, llvm-commits Differential Revision: http://reviews.llvm.org/D17201 llvm-svn: 265535