llvm-project/llvm/lib/Analysis
Diego Novillo f9aa39b0cf Fix PR 24723 - Handle 0-mass backedges in irreducible loops
This corner case happens when we have an irreducible SCC that is
deeply nested.  As we work down the tree, the backedge masses start
getting smaller and smaller until we reach one that is down to 0.

Since we distribute the incoming mass using the backedge masses as
weight, the distributor does not allow zero weights.  So, we simply
ignore them (which will just use the weights of the non-zero nodes).

llvm-svn: 247050
2015-09-08 19:22:17 +00:00
..
AliasAnalysis.cpp [PM/AA] Simplify the AliasAnalysis interface by removing a wrapper 2015-08-06 02:05:46 +00:00
AliasAnalysisCounter.cpp [PM/AA] Sink all the actual code from AliasAnalysisCounter back into the 2015-08-14 02:12:12 +00:00
AliasAnalysisEvaluator.cpp [PM/AA] Simplify the AliasAnalysis interface by removing a wrapper 2015-08-06 02:05:46 +00:00
AliasSetTracker.cpp [PM/AA] Simplify the AliasAnalysis interface by removing a wrapper 2015-08-06 02:05:46 +00:00
Analysis.cpp [ARC] Pull the ObjC ARC components that really serve the role of 2015-08-20 08:06:03 +00:00
AssumptionCache.cpp [PM] Actually add the new pass manager support for the assumption cache. 2015-01-22 21:53:09 +00:00
BasicAliasAnalysis.cpp [BasicAA] Fix the handling of sext and zext in the analysis of GEPs. 2015-08-31 22:32:47 +00:00
BlockFrequencyInfo.cpp Add new constructors for LoopInfo/DominatorTree/BFI/BPI 2015-07-16 23:23:35 +00:00
BlockFrequencyInfoImpl.cpp Fix PR 24723 - Handle 0-mass backedges in irreducible loops 2015-09-08 19:22:17 +00:00
BranchProbabilityInfo.cpp Create a wrapper pass for BranchProbabilityInfo. 2015-07-15 22:48:29 +00:00
CFG.cpp [CaptureTracking] Avoid long compilation time on large basic blocks 2015-06-24 17:53:17 +00:00
CFGPrinter.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
CFLAliasAnalysis.cpp Fix: CFLAA -- Mark no-args returns as unknown 2015-08-28 00:16:18 +00:00
CGSCCPassManager.cpp [PM] Remove the defunt CGSCC-specific debug flag. 2015-01-13 22:45:13 +00:00
CMakeLists.txt [ARC] Pull the ObjC ARC components that really serve the role of 2015-08-20 08:06:03 +00:00
CallGraph.cpp [PM/AA] Remove the last relics of the separate IPA library from LLVM, 2015-08-18 17:51:53 +00:00
CallGraphSCCPass.cpp [PM/AA] Remove the last relics of the separate IPA library from LLVM, 2015-08-18 17:51:53 +00:00
CallPrinter.cpp [PM/AA] Remove the last relics of the separate IPA library from LLVM, 2015-08-18 17:51:53 +00:00
CaptureTracking.cpp [IR] Give catchret an optional 'return value' operand 2015-08-15 02:46:08 +00:00
CodeMetrics.cpp [IR] Add token types 2015-08-14 05:09:07 +00:00
ConstantFolding.cpp Enable constant propagation for more math functions 2015-08-27 19:56:57 +00:00
CostModel.cpp Roll forward r243250 2015-07-26 19:10:03 +00:00
Delinearization.cpp [PM] Port ScalarEvolution to the new pass manager. 2015-08-17 02:08:17 +00:00
DemandedBits.cpp Separate out BDCE's analysis into a separate DemandedBits analysis. 2015-08-14 11:09:09 +00:00
DependenceAnalysis.cpp Fix how DependenceAnalysis calls delinearization 2015-08-19 02:56:36 +00:00
DivergenceAnalysis.cpp Rename inst_range() to instructions() for consistency. NFC 2015-08-06 19:10:45 +00:00
DomPrinter.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
DominanceFrontier.cpp Templatify DominanceFrontier. 2014-07-12 21:59:52 +00:00
GlobalsModRef.cpp [PM/AA] Remove the last relics of the separate IPA library from LLVM, 2015-08-18 17:51:53 +00:00
IVUsers.cpp [PM] Port ScalarEvolution to the new pass manager. 2015-08-17 02:08:17 +00:00
InlineCost.cpp [WinEH] Require token linkage in EH pad/ret signatures 2015-08-23 00:26:33 +00:00
InstCount.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
InstructionSimplify.cpp [InstSimplify] add nuw %x, C2 must be at least C2 2015-08-20 23:01:41 +00:00
Interval.cpp Revert "[C++11] Add predecessors(BasicBlock *) / successors(BasicBlock *) iterator ranges." 2014-07-21 17:06:51 +00:00
IntervalPartition.cpp [C++11] More 'nullptr' conversion. In some cases just using a boolean check instead of comparing to nullptr. 2014-04-15 04:59:12 +00:00
IteratedDominanceFrontier.cpp Move IDF Calculation to a separate file, expose an interface to it. 2015-04-21 19:13:02 +00:00
LLVMBuild.txt [PM/AA] Remove the last relics of the separate IPA library from LLVM, 2015-08-18 17:51:53 +00:00
LazyCallGraph.cpp Revert r225854: [PM] Move the LazyCallGraph printing functionality to 2015-01-14 00:27:45 +00:00
LazyValueInfo.cpp [LazyValueInfo] Look through Phi nodes when trying to prove a predicate 2015-08-31 18:31:48 +00:00
LibCallSemantics.cpp [EH] Handle non-Function personalities like unknown personalities 2015-08-31 20:02:16 +00:00
Lint.cpp [PM/AA] Simplify the AliasAnalysis interface by removing a wrapper 2015-08-06 02:05:46 +00:00
Loads.cpp [PM/AA] Extract the ModRef enums from the AliasAnalysis class in 2015-07-22 23:15:57 +00:00
LoopAccessAnalysis.cpp [LAA] Hold bounds via ValueHandles during SCEV expansion 2015-08-21 23:19:57 +00:00
LoopInfo.cpp [IR] Add token types 2015-08-14 05:09:07 +00:00
LoopPass.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
Makefile [PM/AA] Remove the last relics of the separate IPA library from LLVM, 2015-08-18 17:51:53 +00:00
MemDepPrinter.cpp Rename inst_range() to instructions() for consistency. NFC 2015-08-06 19:10:45 +00:00
MemDerefPrinter.cpp Take alignment into account in isSafeToSpeculativelyExecute and isSafeToLoadUnconditionally. 2015-08-17 15:54:26 +00:00
MemoryBuiltins.cpp DataLayout is mandatory, update the API to reflect it with references. 2015-03-10 02:37:25 +00:00
MemoryDependenceAnalysis.cpp [PM/AA] Add missing static dependency edges from DSE and memdep to TLI. 2015-08-12 18:10:45 +00:00
MemoryLocation.cpp [PM/AA] Split the location computation out of getArgLocation so the 2015-06-17 07:12:40 +00:00
ModuleDebugInfoPrinter.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
NoAliasAnalysis.cpp [PM/AA] Extract the ModRef enums from the AliasAnalysis class in 2015-07-22 23:15:57 +00:00
ObjCARCAliasAnalysis.cpp [ARC] Pull the ObjC ARC components that really serve the role of 2015-08-20 08:06:03 +00:00
ObjCARCAnalysisUtils.cpp [ARC] Pull the ObjC ARC components that really serve the role of 2015-08-20 08:06:03 +00:00
ObjCARCInstKind.cpp [ARC] Pull the ObjC ARC components that really serve the role of 2015-08-20 08:06:03 +00:00
OrderedBasicBlock.cpp [CaptureTracker] Provide an ordered basic block to PointerMayBeCapturedBefore 2015-07-31 14:31:35 +00:00
PHITransAddr.cpp [PHITransAddr] Don't assume that instruction operands are translatable 2015-08-09 15:43:02 +00:00
PostDominators.cpp [Modules] Fix potential ODR violations by sinking the DEBUG_TYPE 2014-04-22 02:48:03 +00:00
PtrUseVisitor.cpp Update SetVector to rely on the underlying set's insert to return a pair<iterator, bool> 2014-11-19 07:49:26 +00:00
README.txt
RegionInfo.cpp [RegionInfo] Add debug-time region viewer functions 2015-08-10 13:21:59 +00:00
RegionPass.cpp Change range-based for-loops to be -Wrange-loop-analysis clean. 2015-04-15 01:21:15 +00:00
RegionPrinter.cpp [RegionInfo] Add debug-time region viewer functions 2015-08-10 13:21:59 +00:00
ScalarEvolution.cpp [SCEV] Fix GCC 4.8.0 ICE in lambda function 2015-08-19 17:26:07 +00:00
ScalarEvolutionAliasAnalysis.cpp [PM] Port ScalarEvolution to the new pass manager. 2015-08-17 02:08:17 +00:00
ScalarEvolutionExpander.cpp [ScalarEvolutionExpander] Reuse findExistingExpansion during expansion cost calculation for division 2015-08-17 16:37:04 +00:00
ScalarEvolutionNormalization.cpp Fix typos in comments, NFC 2014-08-29 21:53:01 +00:00
ScopedNoAliasAA.cpp [PM/AA] Hoist ScopedNoAliasAA's interface into a header and move the 2015-08-14 02:55:50 +00:00
SparsePropagation.cpp [Modules] Fix potential ODR violations by sinking the DEBUG_TYPE 2014-04-22 02:48:03 +00:00
StratifiedSets.h Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
TargetLibraryInfo.cpp Populate list of vectorizable functions for Accelerate library. 2015-05-07 17:11:51 +00:00
TargetTransformInfo.cpp [TTI] Add a hook for specifying per-target defaults for Interleaved Accesses 2015-08-10 14:50:54 +00:00
Trace.cpp
TypeBasedAliasAnalysis.cpp [PM/AA] Hoist the interface to TBAA into a dedicated header along with 2015-08-14 03:33:48 +00:00
ValueTracking.cpp [WinEH] Add cleanupendpad instruction 2015-09-03 09:09:43 +00:00
VectorUtils.cpp NFC: Code style in VectorUtils.cpp 2015-08-30 13:48:02 +00: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))

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