llvm/lib/Analysis
Andrew Trick 10bb82e54f Rewrite SCEV's backedge taken count computation.
Patch by Michele Scandale!

Rewrite of the functions used to compute the backedge taken count of a
loop on LT and GT comparisons.

I decided to split the handling of LT and GT cases becasue the trick
"a > b == -a < -b" in some cases prevents the trip count computation
due to the multiplication by -1 on the two operands of the
comparison. This issue comes from the conservative computation of
value range of SCEVs: taking the negative SCEV of an expression that
have a small positive range (e.g. [0,31]), we would have a SCEV with a
fullset as value range.

Indeed, in the new rewritten function I tried to better handle the
maximum backedge taken count computation when MAX/MIN expression are
used to handle the cases where no entry guard is found.

Some test have been modified in order to check the new value correctly
(I manually check them and reasoning on possible overflow the new
values seem correct).

I finally added a new test case related to the multiplication by -1
issue on GT comparisons.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194116 91177308-0d34-0410-b5e6-96231b3b80d8
2013-11-06 02:08:26 +00:00
..
IPA Merge CallGraph and BasicCallGraph. 2013-10-31 03:03:55 +00:00
AliasAnalysis.cpp Reimplement isPotentiallyReachable to make nocapture deduction much stronger. 2013-07-27 01:24:00 +00:00
AliasAnalysisCounter.cpp
AliasAnalysisEvaluator.cpp Support in AAEvaluator to print alias queries of loads/stores with TBAA tags. 2013-03-22 22:34:41 +00:00
AliasDebugger.cpp
AliasSetTracker.cpp In AliasSetTracker, do not change the alias set to "mod/ref" when adding 2013-09-12 20:15:50 +00:00
Analysis.cpp Remove the very substantial, largely unmaintained legacy PGO 2013-10-02 15:42:23 +00:00
BasicAliasAnalysis.cpp Revert r193251 : Use address-taken to disambiguate global variable and indirect memops. 2013-10-27 03:08:44 +00:00
BlockFrequencyInfo.cpp BlockFrequency: Bump up the entry frequency a bit. 2013-06-25 13:34:40 +00:00
BranchProbabilityInfo.cpp Consider (x == -1) unlikely in BranchProbabilityInfo 2013-11-01 10:58:22 +00:00
CaptureTracking.cpp CaptureTracking: Plug a loophole in the "too many uses" heuristic. 2013-10-03 13:24:02 +00:00
CFG.cpp Add some constantness. 2013-08-20 23:04:15 +00:00
CFGPrinter.cpp
CMakeLists.txt Remove the very substantial, largely unmaintained legacy PGO 2013-10-02 15:42:23 +00:00
CodeMetrics.cpp Begin fleshing out an interface in TTI for modelling the costs of 2013-01-22 11:26:02 +00:00
ConstantFolding.cpp Fix another constant folding address space place I missed. 2013-11-04 20:46:52 +00:00
CostModel.cpp Move variable into assert to avoid unused variable warning. 2013-09-17 21:13:57 +00:00
DependenceAnalysis.cpp Remove extraneous semicolon. 2013-08-06 16:40:40 +00:00
DominanceFrontier.cpp
DomPrinter.cpp
InstCount.cpp
InstructionSimplify.cpp Teach MemoryBuiltins and InstructionSimplify that operator new never returns NULL. 2013-09-24 16:37:51 +00:00
Interval.cpp
IntervalPartition.cpp
IVUsers.cpp
LazyValueInfo.cpp Use SmallVectorImpl::iterator/const_iterator instead of SmallVector to avoid specifying the vector size. 2013-07-04 01:31:24 +00:00
LibCallAliasAnalysis.cpp
LibCallSemantics.cpp
Lint.cpp Fix lint assert on integer vector division 2013-08-26 23:29:33 +00:00
LLVMBuild.txt
Loads.cpp Change GetPointerBaseWithConstantOffset's DataLayout argument from a 2013-01-31 02:00:45 +00:00
LoopInfo.cpp Quick look-up for block in loop. 2013-10-26 03:08:02 +00:00
LoopPass.cpp Comment: try to clarify loop iteration order. 2013-07-20 23:10:31 +00:00
Makefile
MemDepPrinter.cpp
MemoryBuiltins.cpp fix PR17635: false positive with packed structures 2013-10-24 09:17:24 +00:00
MemoryDependenceAnalysis.cpp Fix xemacs mode line, don't put them in .cpp files (just header files). No 2013-06-10 23:10:59 +00:00
ModuleDebugInfoPrinter.cpp
NoAliasAnalysis.cpp
PHITransAddr.cpp
PostDominators.cpp
PtrUseVisitor.cpp
README.txt
RegionInfo.cpp Reorder headers according to lint. 2013-08-21 21:14:19 +00:00
RegionPass.cpp
RegionPrinter.cpp
ScalarEvolution.cpp Rewrite SCEV's backedge taken count computation. 2013-11-06 02:08:26 +00:00
ScalarEvolutionAliasAnalysis.cpp
ScalarEvolutionExpander.cpp Fix SCEVExpander: don't try to expand quadratic recurrences outside a loop. 2013-10-25 21:35:56 +00:00
ScalarEvolutionNormalization.cpp Fix LSR: don't normalize quadratic recurrences. 2013-10-25 21:35:52 +00:00
SparsePropagation.cpp
TargetTransformInfo.cpp Costmodel: Add support for horizontal vector reductions 2013-09-17 18:06:50 +00:00
Trace.cpp
TypeBasedAliasAnalysis.cpp TBAA: fix PR17620. 2013-10-22 01:40:25 +00:00
ValueTracking.cpp Remove x86_sse42_crc32_64_8 intrinsic. It has no functional difference from x86_sse42_crc32_32_8 and was not mapped to a clang builtin. I'm not even sure why this form of the instruction is even called out explicitly in the docs. Also add AutoUpgrade support to convert it into the other intrinsic with appropriate trunc and zext. 2013-10-15 05:20:47 +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))

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