llvm-6502/lib/Analysis
Dan Gohman 948c8a3e3d When checking whether the special handling for an addrec increment which
doesn't dominate the header is needed, don't check whether the increment
expression has computable loop evolution. While the operands of an
addrec are required to be loop-invariant, they're not required to 
dominate any part of the loop. This fixes PR6914.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102389 91177308-0d34-0410-b5e6-96231b3b80d8
2010-04-26 21:46:36 +00:00
..
IPA fix callgraph dump to not print 0x0x1234 for nodes. 2010-04-23 18:23:40 +00:00
AliasAnalysis.cpp
AliasAnalysisCounter.cpp
AliasAnalysisEvaluator.cpp clean up algorithm and remove operand order assumptions 2010-04-08 16:46:24 +00:00
AliasDebugger.cpp
AliasSetTracker.cpp
Analysis.cpp
BasicAliasAnalysis.cpp Revert 101465, it broke internal OpenGL testing. 2010-04-16 23:37:20 +00:00
CaptureTracking.cpp
CFGPrinter.cpp
CMakeLists.txt Update CMake build. 2010-04-08 18:52:18 +00:00
ConstantFolding.cpp Revert 101465, it broke internal OpenGL testing. 2010-04-16 23:37:20 +00:00
DbgInfoPrinter.cpp
DebugInfo.cpp DebugInfoFinder::processModule was foiling my plot by 2010-04-02 20:44:29 +00:00
DomPrinter.cpp Remove dead code in the dotty dominance tree printer. 2010-04-12 15:02:19 +00:00
InlineCost.cpp Revert r101471. For tight recursive functions which have multiple 2010-04-21 00:43:30 +00:00
InstCount.cpp
InstructionSimplify.cpp move some select simplifications out out instcombine into 2010-04-20 05:32:14 +00:00
Interval.cpp
IntervalPartition.cpp
IVUsers.cpp Remove the Expr member from IVUsers. Instead of remembering the expression, 2010-04-19 21:48:58 +00:00
LazyValueInfo.cpp
LibCallAliasAnalysis.cpp
LibCallSemantics.cpp
Lint.cpp Tidy a comment. 2010-04-22 01:30:05 +00:00
LiveValues.cpp
LoopDependenceAnalysis.cpp
LoopInfo.cpp Fix a bunch of namespace polution. 2010-04-15 17:08:50 +00:00
LoopPass.cpp Ok, third time's the charm. No changes from last time except the CMake 2010-04-02 23:17:14 +00:00
Makefile
MemoryBuiltins.cpp Revert 101465, it broke internal OpenGL testing. 2010-04-16 23:37:20 +00:00
MemoryDependenceAnalysis.cpp Revert 101465, it broke internal OpenGL testing. 2010-04-16 23:37:20 +00:00
PHITransAddr.cpp
PointerTracking.cpp Rename isLoopGuardedByCond to isLoopEntryGuardedByCond, to emphasise 2010-04-11 19:27:13 +00:00
PostDominators.cpp Remove unneeded debug in PostDominator runOnFunction() 2010-04-12 15:32:55 +00:00
ProfileEstimatorPass.cpp
ProfileInfo.cpp
ProfileInfoLoader.cpp
ProfileInfoLoaderPass.cpp
ProfileVerifierPass.cpp
README.txt When checking whether the special handling for an addrec increment which 2010-04-26 21:46:36 +00:00
ScalarEvolution.cpp ScalarEvolution support for <= and >= loops. 2010-04-24 03:09:42 +00:00
ScalarEvolutionAliasAnalysis.cpp
ScalarEvolutionExpander.cpp When checking whether the special handling for an addrec increment which 2010-04-26 21:46:36 +00:00
ScalarEvolutionNormalization.cpp Generalize IVUsers to track arbitrary expressions rather than expressions 2010-04-07 22:27:08 +00:00
SparsePropagation.cpp
Trace.cpp
ValueTracking.cpp Revert 101465, it broke internal OpenGL testing. 2010-04-16 23:37:20 +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))

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