llvm-project/llvm/lib/Analysis
Malhar Jajoo 778b455dd6 [LAA] Add Memory dependence remarks.
Adds new optimization remarks when vectorization fails.

More specifically, new remarks are added for following 4 cases:

- Backward dependency
- Backward dependency that prevents Store-to-load forwarding
- Forward dependency that prevents Store-to-load forwarding
- Unknown dependency

It is important to note that only one of the sources
of failures (to vectorize) is reported by the remarks.
This source of failure may not be first in program order.

A regression test has been added to test the following cases:

a) Loop can be vectorized: No optimization remark is emitted
b) Loop can not be vectorized: In this case an optimization
remark will be emitted for one source of failure.

Reviewed By: sdesmalen, david-arm

Differential Revision: https://reviews.llvm.org/D108371
2022-02-02 12:07:51 +00:00
..
models [MLGO] ML Regalloc Eviction Advisor 2022-01-19 11:00:32 -08:00
AliasAnalysis.cpp [LICM] Generalize unwinding check during scalar promotion 2022-01-26 11:15:03 +01:00
AliasAnalysisEvaluator.cpp [NFC] Remove uses of PointerType::getElementType() 2022-01-25 09:44:52 +01:00
AliasAnalysisSummary.cpp
AliasAnalysisSummary.h
AliasSetTracker.cpp [NFC][AA] Prepare to convert AliasResult to class with PartialAlias offset. 2021-04-09 12:54:22 +03:00
Analysis.cpp Reapply CycleInfo: Introduce cycles as a generalization of loops 2021-12-10 14:36:43 +05:30
AssumeBundleQueries.cpp Make various assume bundle data structures use uint64_t 2021-10-13 10:38:41 -07:00
AssumptionCache.cpp [InferAddressSpaces] Support assumed addrspaces from addrspace predicates. 2021-11-08 16:51:57 -05:00
BasicAliasAnalysis.cpp [BasicAA] Add support for memmove intrinsic 2022-01-28 18:19:36 +07:00
BlockFrequencyInfo.cpp Internalize some cl::opt global variables or move them under namespace llvm 2021-05-07 11:15:43 -07:00
BlockFrequencyInfoImpl.cpp [NFC] Use Optional<ProfileCount> to model invalid counts 2021-11-14 19:03:30 -08:00
BranchProbabilityInfo.cpp [NFC] Add missing <map> includes 2022-01-19 12:29:03 +01:00
CFG.cpp [CFG] Move reachable from entry checks into basic block variant 2021-05-15 15:42:02 +02:00
CFGPrinter.cpp Use `-cfg-func-name` value as filter for `-view-cfg`, etc. 2021-06-16 23:54:51 +02:00
CFLAndersAliasAnalysis.cpp [NFC][AA] Prepare to convert AliasResult to class with PartialAlias offset. 2021-04-09 12:54:22 +03:00
CFLGraph.h
CFLSteensAliasAnalysis.cpp [llvm] Remove redundant member initialization (NFC) 2022-01-07 17:45:09 -08:00
CGSCCPassManager.cpp [NewPM] Add option to prevent rerunning function pipeline on functions in CGSCC adaptor 2021-11-17 09:06:46 -08:00
CMakeLists.txt [NFC][mlgo]Make the test model generator inlining-specific 2021-12-22 13:38:45 -08:00
CallGraph.cpp
CallGraphSCCPass.cpp [llvm] Remove redundant member initialization (NFC) 2022-01-07 17:45:09 -08:00
CallPrinter.cpp Revert "[NFC] Remove LinkAll*.h" 2021-11-02 09:08:09 -07:00
CaptureTracking.cpp [Analysis] Use default member initialization (NFC) 2022-01-23 20:32:56 -08:00
CmpInstAnalysis.cpp [APInt] Stop using soft-deprecated constructors and methods in llvm. NFC. 2021-10-04 08:57:44 +01:00
CodeMetrics.cpp [CodeMetrics] Don't require speculatability for ephemeral values 2021-10-21 20:30:01 +02:00
ConstantFolding.cpp [NFC] Remove uses of PointerType::getElementType() 2022-01-25 09:44:52 +01:00
ConstraintSystem.cpp [ConstraintSystem] Mark function as const (NFC). 2022-01-27 13:44:47 +00:00
CostModel.cpp [Analysis] Use default member initialization (NFC) 2022-01-23 20:32:56 -08:00
CycleAnalysis.cpp Reapply CycleInfo: Introduce cycles as a generalization of loops 2021-12-10 14:36:43 +05:30
DDG.cpp [llvm] Remove redundant member initialization (NFC) 2022-01-07 17:45:09 -08:00
DDGPrinter.cpp Support: Stop using F_{None,Text,Append} compatibility synonyms, NFC 2021-04-30 11:00:03 -07:00
Delinearization.cpp [SCEV] Move getIndexExpressionsFromGEP to delinearize [NFC] 2021-09-08 16:56:49 -07:00
DemandedBits.cpp [APInt] Normalize naming on keep constructors / predicate methods. 2021-09-09 09:50:24 -07:00
DependenceAnalysis.cpp [APInt] Normalize naming on keep constructors / predicate methods. 2021-09-09 09:50:24 -07:00
DependenceGraphBuilder.cpp
DevelopmentModeInlineAdvisor.cpp [llvm] Remove uses of `std::vector<bool>` 2022-01-18 18:20:45 +01:00
DivergenceAnalysis.cpp [Analysis] Use default member initialization (NFC) 2022-01-23 20:32:56 -08:00
DomPrinter.cpp Introduce NewPM .dot printers for DomTree 2022-01-05 23:25:40 +00:00
DomTreeUpdater.cpp [NFCI][DomTreeUpdater] applyUpdates(): reserve space for updates first 2021-04-11 23:56:22 +03:00
DominanceFrontier.cpp [llvm] Remove redundant member initialization (NFC) 2022-01-07 17:45:09 -08:00
EHPersonalities.cpp [XCOFF] Handle the case when personality routine is an alias 2021-04-29 22:03:30 +00:00
FunctionPropertiesAnalysis.cpp
GlobalsModRef.cpp [GlobalsModRef] Apply indirect-global rule to all globals initialized from noalias calls 2022-01-11 08:44:31 -08:00
GuardUtils.cpp
HeatUtils.cpp [llvm][clang][NFC] updates inline licence info 2021-08-11 02:48:53 +00:00
IRSimilarityIdentifier.cpp [Analysis] Use != to compare strings (NFC) 2022-01-30 12:32:57 -08:00
IVDescriptors.cpp [IVDescriptor] Get the exact FP instruction that does not allow reordering 2022-01-27 00:33:46 -05:00
IVUsers.cpp [llvm] Remove redundant member initialization (NFC) 2022-01-07 17:45:09 -08:00
ImportedFunctionsInliningStatistics.cpp [Analysis] ImportedFunctionsInliningStatistics.h - add <memory> and remove unused <string> include. NFCI. 2021-04-19 16:20:56 +01:00
IndirectCallPromotionAnalysis.cpp
InlineAdvisor.cpp [MLGO] Improved support for AOT cross-targeting scenarios 2022-01-20 07:05:39 -08:00
InlineCost.cpp [Analysis] Use default member initialization (NFC) 2022-01-23 20:32:56 -08:00
InlineSizeEstimatorAnalysis.cpp [llvm][clang][NFC] updates inline licence info 2021-08-11 02:48:53 +00:00
InstCount.cpp
InstructionPrecedenceTracking.cpp Revert "[IPT] Restructure cache to allow lazy update following invalidation [NFC]" 2021-10-21 10:48:41 -07:00
InstructionSimplify.cpp [InstSimplify] fold 'xor X, poison' and 'div/rem X, poison' to poison 2022-01-30 10:46:54 +00:00
Interval.cpp
IntervalPartition.cpp [llvm] Use range-based for loops (NFC) 2021-11-20 18:42:10 -08:00
LazyBlockFrequencyInfo.cpp Make dependency between certain analysis passes transitive (reapply) 2021-05-05 15:17:55 +02:00
LazyBranchProbabilityInfo.cpp Make dependency between certain analysis passes transitive (reapply) 2021-05-05 15:17:55 +02:00
LazyCallGraph.cpp [Inliner] Don't removeDeadConstantUsers() when checking if a function is dead 2022-01-13 14:29:45 -08:00
LazyValueInfo.cpp [LVI] Handle implication from icmp of trunc (PR51867) 2022-01-18 11:24:11 +01:00
LegacyDivergenceAnalysis.cpp
Lint.cpp Put implementation details into anonymous namespaces. NFCI. 2021-11-07 15:18:30 +01:00
Loads.cpp [Loads] Require Align in isDereferenceableAndAlignedPointer() (NFC) 2022-01-28 16:23:32 +01:00
LoopAccessAnalysis.cpp [LAA] Add Memory dependence remarks. 2022-02-02 12:07:51 +00:00
LoopAnalysisManager.cpp [NewPM] Don't mark AA analyses as preserved 2021-05-18 13:49:03 -07:00
LoopCacheAnalysis.cpp [llvm] Remove redundant member initialization (NFC) 2022-01-07 17:45:09 -08:00
LoopInfo.cpp [ScalarEvolution] Mark a loop as finite if in a willreturn function 2022-01-28 14:17:05 -05:00
LoopNestAnalysis.cpp LoopNest Analysis expansion to return instructions that prevent a Loop 2021-08-17 22:25:49 +00:00
LoopPass.cpp [llvm] Remove redundant member initialization (NFC) 2022-01-07 17:45:09 -08:00
LoopUnrollAnalyzer.cpp [unroll] Use value domain for symbolic execution based cost model 2021-05-26 08:41:25 -07:00
MLInlineAdvisor.cpp [NFC][MLGO] Simplify conditional compilation 2022-01-24 11:19:04 -08:00
MemDepPrinter.cpp
MemDerefPrinter.cpp [Loads] Require Align in isDereferenceableAndAlignedPointer() (NFC) 2022-01-28 16:23:32 +01:00
MemoryBuiltins.cpp [MemoryBuiltins] Demote isMallocLikeFn to implementation routine since last use has been removed 2022-01-18 15:24:52 -08:00
MemoryDependenceAnalysis.cpp [MemoryBuiltins] Remove isNoAliasFn() in favor of isNoAliasCall() 2022-01-10 09:18:15 +01:00
MemoryLocation.cpp [DSE][MemLoc] Handle intrinsics more generically 2021-12-24 09:29:57 +01:00
MemorySSA.cpp [Analysis] Use default member initialization (NFC) 2022-01-23 20:32:56 -08:00
MemorySSAUpdater.cpp [llvm] Use range-based for loops (NFC) 2021-11-18 09:09:52 -08:00
ModelUnderTrainingRunner.cpp [NFC][MLGO] Remove the word "inliner" in a generic error message. 2022-01-11 12:39:16 -08:00
ModuleDebugInfoPrinter.cpp
ModuleSummaryAnalysis.cpp [LTO][WPD] Simplify mustBeUnreachableFunction and test after D115492 2021-12-15 15:43:35 -08:00
MustExecute.cpp
NoInferenceModelRunner.cpp [NFC][MLGO]Add RTTI support for MLModelRunner and simplify runner setup 2022-01-04 19:46:14 -08:00
ObjCARCAliasAnalysis.cpp [NFC][AA] Prepare to convert AliasResult to class with PartialAlias offset. 2021-04-09 12:54:22 +03:00
ObjCARCAnalysisUtils.cpp
ObjCARCInstKind.cpp [ObjCARC] Use "UnsafeClaimRV" to refer to unsafeClaim in enums. NFC. 2022-01-24 19:37:01 -08:00
OptimizationRemarkEmitter.cpp
OverflowInstAnalysis.cpp Ensure newlines at the end of files (NFC) 2021-10-23 08:45:29 -07:00
PHITransAddr.cpp [InstSimplify] Pass pointer and indices separately to SimplifyGEPInst. 2022-01-14 09:59:52 +00:00
PhiValues.cpp
PostDominators.cpp
ProfileSummaryInfo.cpp [NFC] Use Optional<ProfileCount> to model invalid counts 2021-11-14 19:03:30 -08:00
PtrUseVisitor.cpp
README.txt
RegionInfo.cpp Revert "[NFC] Remove LinkAll*.h" 2021-11-02 09:08:09 -07:00
RegionPass.cpp [llvm] Remove redundant member initialization (NFC) 2022-01-07 17:45:09 -08:00
RegionPrinter.cpp
ReplayInlineAdvisor.cpp [Analysis] Use default member initialization (NFC) 2022-01-23 20:32:56 -08:00
ScalarEvolution.cpp [ScalarEvolution] Add bailout to avoid zext of pointer. 2022-01-31 11:41:39 -08:00
ScalarEvolutionAliasAnalysis.cpp [SCEVAA] Avoid forming malformed pointer diff expressions 2021-11-17 12:38:04 -08:00
ScalarEvolutionDivision.cpp
ScalarEvolutionNormalization.cpp
ScopedNoAliasAA.cpp [NFC][AA] Prepare to convert AliasResult to class with PartialAlias offset. 2021-04-09 12:54:22 +03:00
StackLifetime.cpp [NPM] Added -print-pipeline-passes print params for a few passes. 2021-09-15 08:34:04 +02:00
StackSafetyAnalysis.cpp [stack-safety] Check SCEV constraints at memory instructions. 2021-11-23 15:29:23 -08:00
StratifiedSets.h
SyncDependenceAnalysis.cpp [DA][NFC] Update publication - add remarks 2021-11-22 12:58:19 +01:00
SyntheticCountsUtils.cpp
TFUtils.cpp [MLGO] Add support for multiple training traces per module 2022-01-11 16:13:31 -08:00
TargetLibraryInfo.cpp Revert "Revert "Use VersionTuple for parsing versions in Triple, fixing issues that caused the original change to be reverted. This makes it possible to distinguish between "16" and "16.0" after parsing, which previously was not possible."" 2021-12-07 23:15:21 +00:00
TargetTransformInfo.cpp [LoopVectorize] Pass a vector type to isLegalMaskedGather/Scatter 2022-01-12 13:34:12 +00:00
Trace.cpp
TypeBasedAliasAnalysis.cpp [LoopIdiom] Keep TBAA when creating memcpy/memmove 2022-01-31 16:28:13 -05:00
TypeMetadataUtils.cpp [GlobalDCE] In VFE, replace the whole 'sub' expression of unused relative-pointer-based vtable slots 2021-10-06 15:55:55 -07:00
VFABIDemangling.cpp [LLVM][NFC]Inclusive language: remove occurances of sanity check/test from llvm 2021-11-24 17:29:55 -05:00
ValueLattice.cpp
ValueLatticeUtils.cpp
ValueTracking.cpp [Loads] Require Align in isDereferenceableAndAlignedPointer() (NFC) 2022-01-28 16:23:32 +01:00
VectorUtils.cpp [Analysis] add utility function for unary shuffle mask creation 2021-10-18 09:00:39 -04:00

README.txt

Analysis Opportunities:

//===---------------------------------------------------------------------===//

In test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll, the
ScalarEvolution expression for %r is this:

  {1,+,3,+,2}<loop>

Outside the loop, this could be evaluated simply as (%n * %n), however
ScalarEvolution currently evaluates it as

  (-2 + (2 * (trunc i65 (((zext i64 (-2 + %n) to i65) * (zext i64 (-1 + %n) to i65)) /u 2) to i64)) + (3 * %n))

In addition to being much more complicated, it involves i65 arithmetic,
which is very inefficient when expanded into code.

//===---------------------------------------------------------------------===//

In formatValue in test/CodeGen/X86/lsr-delayed-fold.ll,

ScalarEvolution is forming this expression:

((trunc i64 (-1 * %arg5) to i32) + (trunc i64 %arg5 to i32) + (-1 * (trunc i64 undef to i32)))

This could be folded to

(-1 * (trunc i64 undef to i32))

//===---------------------------------------------------------------------===//