llvm-6502/lib/Analysis
Andrew Trick d832d32f57 Fix a severe compile time problem when forming large SCEV expressions.
This fix is very lightweight. The same fix already existed for AddRec
but was missing for NAry expressions.

This is obviously an improvement and I'm unsure how to test compile
time problems.

Patch by Xiaoyi Guo!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187475 91177308-0d34-0410-b5e6-96231b3b80d8
2013-07-31 02:43:40 +00:00
..
IPA Have InlineCost check constant fcmps 2013-07-20 04:09:00 +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
Analysis.cpp This patch breaks up Wrap.h so that it does not have to include all of 2013-05-01 20:59:00 +00:00
BasicAliasAnalysis.cpp Use SmallVectorImpl& instead of SmallVector to avoid repeating small vector size. 2013-07-14 04:42:23 +00:00
BlockFrequencyInfo.cpp BlockFrequency: Bump up the entry frequency a bit. 2013-06-25 13:34:40 +00:00
BranchProbabilityInfo.cpp Use SmallVectorImpl::iterator/const_iterator instead of SmallVector to avoid specifying the vector size. 2013-07-04 01:31:24 +00:00
CaptureTracking.cpp Extend 'readonly' and 'readnone' to work on function arguments as well as 2013-07-06 00:29:58 +00:00
CFG.cpp Reimplement isPotentiallyReachable to make nocapture deduction much stronger. 2013-07-27 01:24:00 +00:00
CFGPrinter.cpp
CMakeLists.txt Also update CMakeLists.txt for r187283. 2013-07-27 01:25:51 +00:00
CodeMetrics.cpp
ConstantFolding.cpp ConstantFolding: ComputeMaskedBits wants the scalar size for vectors. 2013-04-19 16:56:24 +00:00
CostModel.cpp Use SmallVectorImpl& instead of SmallVector to avoid repeating small vector size. 2013-07-11 16:22:38 +00:00
DependenceAnalysis.cpp Use SmallVectorImpl& instead of SmallVector to avoid repeating small vector size. 2013-07-14 04:42:23 +00:00
DominanceFrontier.cpp
DomPrinter.cpp
InstCount.cpp
InstructionSimplify.cpp Fix logic error optimizing "icmp pred (urem X, Y), Y" where pred is signed. 2013-07-12 23:42:57 +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
LLVMBuild.txt
Loads.cpp
LoopInfo.cpp Add 'const' qualifiers to static const char* variables. 2013-07-16 01:17:10 +00:00
LoopPass.cpp Comment: try to clarify loop iteration order. 2013-07-20 23:10:31 +00:00
Makefile
MemDepPrinter.cpp
MemoryBuiltins.cpp Treat nothrow forms of ::operator delete and ::operator delete[] as 2013-07-21 23:11:42 +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
PathNumbering.cpp
PathProfileInfo.cpp
PathProfileVerifier.cpp Build fixes for STLPort + GCC 2013-03-29 18:48:45 +00:00
PHITransAddr.cpp
PostDominators.cpp
ProfileDataLoader.cpp Use SmallVectorImpl& instead of SmallVector to avoid repeating small vector size. 2013-07-14 04:42:23 +00:00
ProfileDataLoaderPass.cpp
ProfileEstimatorPass.cpp Use SmallVectorImpl::iterator/const_iterator instead of SmallVector to avoid specifying the vector size. 2013-07-04 01:31:24 +00:00
ProfileInfo.cpp Build fixes for STLPort + GCC 2013-03-29 18:48:45 +00:00
ProfileInfoLoader.cpp
ProfileInfoLoaderPass.cpp
ProfileVerifierPass.cpp
PtrUseVisitor.cpp
README.txt
RegionInfo.cpp RegionInfo: Do not crash if unreachable block is found 2013-05-03 15:48:34 +00:00
RegionPass.cpp
RegionPrinter.cpp
ScalarEvolution.cpp Fix a severe compile time problem when forming large SCEV expressions. 2013-07-31 02:43:40 +00:00
ScalarEvolutionAliasAnalysis.cpp
ScalarEvolutionExpander.cpp Remove a bunch of old SCEVExpander FIXME's for preserving NoWrap. 2013-07-14 03:10:08 +00:00
ScalarEvolutionNormalization.cpp
SparsePropagation.cpp
TargetTransformInfo.cpp SimplifyCFG: Use parallel-and and parallel-or mode to consolidate branch conditions 2013-07-27 00:01:07 +00:00
Trace.cpp
TypeBasedAliasAnalysis.cpp Struct-path aware TBAA: change the format of TBAAStructType node. 2013-04-27 00:26:11 +00:00
ValueTracking.cpp isKnownToBeAPowerOfTwo: Strengthen isKnownToBeAPowerOfTwo's analysis on add instructions 2013-07-30 21:01:36 +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))

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