llvm/lib/Analysis
Silviu Baranga 90f6cd579a Re-commit r255115, with the PredicatedScalarEvolution class moved to
ScalarEvolution.h, in order to avoid cyclic dependencies between the Transform
and Analysis modules:

[LV][LAA] Add a layer over SCEV to apply run-time checked knowledge on SCEV expressions

Summary:
This change creates a layer over ScalarEvolution for LAA and LV, and centralizes the
usage of SCEV predicates. The SCEVPredicatedLayer takes the statically deduced knowledge
by ScalarEvolution and applies the knowledge from the SCEV predicates. The end goal is
that both LAA and LV should use this interface everywhere.

This also solves a problem involving the result of SCEV expression rewritting when
the predicate changes. Suppose we have the expression (sext {a,+,b}) and two predicates
  P1: {a,+,b} has nsw
  P2: b = 1.

Applying P1 and then P2 gives us {a,+,1}, while applying P2 and the P1 gives us
sext({a,+,1}) (the AddRec expression was changed by P2 so P1 no longer applies).
The SCEVPredicatedLayer maintains the order of transformations by feeding back
the results of previous transformations into new transformations, and therefore
avoiding this issue.

The SCEVPredicatedLayer maintains a cache to remember the results of previous
SCEV rewritting results. This also has the benefit of reducing the overall number
of expression rewrites.

Reviewers: mzolotukhin, anemet

Subscribers: jmolloy, sanjoy, llvm-commits

Differential Revision: http://reviews.llvm.org/D14296



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255122 91177308-0d34-0410-b5e6-96231b3b80d8
2015-12-09 16:06:28 +00:00
..
AliasAnalysis.cpp [AliasAnalysis] CatchPad and CatchRet can modify escaped memory 2015-11-17 08:15:14 +00:00
AliasAnalysisEvaluator.cpp Default SetVector to use a DenseSet. 2015-11-18 06:52:18 +00:00
AliasSetTracker.cpp Revert "r251451 - [AliasSetTracker] Use mod/ref information for UnknownInstr" 2015-10-28 22:13:41 +00:00
Analysis.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
AssumptionCache.cpp
BasicAliasAnalysis.cpp Fix a typo in BasicAliasAnalysis 2015-11-17 08:15:08 +00:00
BlockFrequencyInfo.cpp Recommit r250345, it was reverted in r250366 to investigate a bot failure. 2015-10-15 14:59:40 +00:00
BlockFrequencyInfoImpl.cpp Recommit r250345, it was reverted in r250366 to investigate a bot failure. 2015-10-15 14:59:40 +00:00
BranchProbabilityInfo.cpp Replace all weight-based interfaces in MBB with probability-based interfaces, and update all uses of old interfaces. 2015-12-01 05:29:22 +00:00
CallGraph.cpp [Analysis/CallGraph] Switch dump() definitions over to LLVM_DUMP_METHOD. 2015-11-23 02:58:42 +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 Refactor: Simplify boolean conditional return statements in llvm/lib/Analysis 2015-11-05 21:07:12 +00:00
CFG.cpp Add some constantness to GetSuccessorNumber(). 2015-11-20 23:02:06 +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 [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
CGSCCPassManager.cpp
CMakeLists.txt Move EH-specific helper functions to a more appropriate place 2015-12-02 23:06:39 +00:00
CodeMetrics.cpp Use all_of to simplify control flow. NFC. 2015-10-24 19:30:37 +00:00
ConstantFolding.cpp Enable constant propagation for more math functions 2015-08-27 19:56:57 +00:00
CostModel.cpp Refactor: Simplify boolean conditional return statements in llvm/lib/Analysis 2015-11-05 21:07:12 +00:00
Delinearization.cpp SCEV: Allow simple AddRec * Parameter products in delinearization 2015-10-12 08:02:00 +00:00
DemandedBits.cpp Compute demanded bits for icmp instructions 2015-10-08 12:40:06 +00:00
DependenceAnalysis.cpp [SCEV] Introduce ScalarEvolution::getOne and getZero. 2015-09-23 01:59:04 +00:00
DivergenceAnalysis.cpp Analysis: Remove implicit ilist iterator conversions 2015-10-10 00:53:03 +00:00
DominanceFrontier.cpp
DomPrinter.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
EHPersonalities.cpp Forgot to add this file with r254562. 2015-12-02 23:09:05 +00:00
GlobalsModRef.cpp Remove unnecessary intermediate lambda. NFC 2015-11-29 04:37:14 +00:00
InlineCost.cpp Use updated threshold for indirect call bonus 2015-12-07 21:21:20 +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 Remove unnecessary intermediate lambda. NFC 2015-11-29 04:37:14 +00:00
Interval.cpp
IntervalPartition.cpp
IteratedDominanceFrontier.cpp
IVUsers.cpp Analysis: Remove implicit ilist iterator conversions 2015-10-10 00:53:03 +00:00
LazyCallGraph.cpp
LazyValueInfo.cpp [LVI] Update a comment to clarify what's actually happening and why 2015-11-04 01:47:04 +00:00
Lint.cpp Revert "Change memcpy/memset/memmove to have dest and source alignments." 2015-11-19 05:56:52 +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
Loads.cpp Analysis: Remove implicit ilist iterator conversions 2015-10-10 00:53:03 +00:00
LoopAccessAnalysis.cpp Re-commit r255115, with the PredicatedScalarEvolution class moved to 2015-12-09 16:06:28 +00:00
LoopInfo.cpp [IndVars] Have getInsertPointForUses preserve LCSSA 2015-12-08 00:13:21 +00:00
LoopPass.cpp PM: Rephrase PrintLoopPass as a wrapper around a new-style pass. NFC 2015-11-04 22:24:08 +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 [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
MemDerefPrinter.cpp Take alignment into account in isSafeToSpeculativelyExecute and isSafeToLoadUnconditionally. 2015-08-17 15:54:26 +00:00
MemoryBuiltins.cpp [Analysis] Become aware of MSVC's new/delete functions 2015-12-03 22:45:19 +00:00
MemoryDependenceAnalysis.cpp Analysis: Remove implicit ilist iterator conversions 2015-10-10 00:53:03 +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
ObjCARCAliasAnalysis.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +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 Analysis: Remove implicit ilist iterator conversions 2015-10-10 00:53: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
PtrUseVisitor.cpp
README.txt
RegionInfo.cpp [RegionInfo] Add debug-time region viewer functions 2015-08-10 13:21:59 +00:00
RegionPass.cpp
RegionPrinter.cpp [RegionInfo] Add debug-time region viewer functions 2015-08-10 13:21:59 +00:00
ScalarEvolution.cpp Re-commit r255115, with the PredicatedScalarEvolution class moved to 2015-12-09 16:06:28 +00:00
ScalarEvolutionAliasAnalysis.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
ScalarEvolutionExpander.cpp [SCEVExpander] Have hoistIVInc preserve LCSSA 2015-12-08 00:13:17 +00:00
ScalarEvolutionNormalization.cpp Analysis: Remove implicit ilist iterator conversions 2015-10-10 00:53:03 +00:00
ScopedNoAliasAA.cpp Fix Clang-tidy modernize-use-nullptr warnings in source directories and generated files; other minor cleanups. 2015-10-06 23:24:35 +00:00
SparsePropagation.cpp Analysis: Remove implicit ilist iterator conversions 2015-10-10 00:53: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 [TargetLibraryInfo] Add support for fls, flsl, flsll. 2015-11-09 23:23:20 +00:00
TargetTransformInfo.cpp Revert r243347 "Add TargetTransformInfo::isZExtFree." 2015-11-12 20:51:52 +00:00
Trace.cpp
TypeBasedAliasAnalysis.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
ValueTracking.cpp [ValueTracking] Remove untested / unreachable code, NFC 2015-11-11 00:16:41 +00:00
VectorUtils.cpp Fixed a failure in getSpaltValue() 2015-12-01 12:30:40 +00:00

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))

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