llvm-6502/lib/Analysis
Chris Lattner 05e15f8897 Switch GVN and memdep to use PHITransAddr, which correctly handles
phi translation of complex expressions like &A[i+1].  This has the
following benefits:

1. The phi translation logic is all contained in its own class with
   a strong interface and verification that it is self consistent.

2. The logic is more correct than before.  Previously, if intermediate
   expressions got PHI translated, we'd miss the update and scan for
   the wrong pointers in predecessor blocks.  @phi_trans2 is a testcase
   for this.

3. We have a lot less code in memdep.

We can handle phi translation across blocks of things like @phi_trans3,
which is pretty insane :).

This patch should fix the miscompiles of 255.vortex, and I tested it 
with a bootstrap of llvm-gcc, llvm-test and dejagnu of course.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90926 91177308-0d34-0410-b5e6-96231b3b80d8
2009-12-09 01:59:31 +00:00
..
IPA Remove the AliasAnalysis::getMustAliases method, which is dead. 2009-11-22 16:01:44 +00:00
AliasAnalysis.cpp use the new isNoAlias method to simplify some code, only do an escaping check if 2009-11-23 16:46:41 +00:00
AliasAnalysisCounter.cpp Remove includes of Support/Compiler.h that are no longer needed after the 2009-10-25 06:57:41 +00:00
AliasAnalysisEvaluator.cpp Remove includes of Support/Compiler.h that are no longer needed after the 2009-10-25 06:57:41 +00:00
AliasDebugger.cpp Remove the AliasAnalysis::getMustAliases method, which is dead. 2009-11-22 16:01:44 +00:00
AliasSetTracker.cpp Remove the AliasAnalysis::getMustAliases method, which is dead. 2009-11-22 16:01:44 +00:00
Analysis.cpp Tidy #includes. 2009-08-11 16:02:12 +00:00
BasicAliasAnalysis.cpp move DecomposeGEPExpression out into ValueTracking.cpp 2009-11-26 17:12:50 +00:00
CaptureTracking.cpp Fix a typo in a comment, and adjust SmallSet and SmallVector sizes, 2009-12-09 00:28:42 +00:00
CFGPrinter.cpp Remove includes of Support/Compiler.h that are no longer needed after the 2009-10-25 06:57:41 +00:00
CMakeLists.txt add to cmake 2009-12-04 04:15:36 +00:00
ConstantFolding.cpp Fix PR5551 by not ignoring the top level constantexpr when 2009-12-04 06:29:29 +00:00
DbgInfoPrinter.cpp Remove VISIBILITY_HIDDEN from class/struct found inside anonymous namespaces. 2009-10-25 06:33:48 +00:00
DebugInfo.cpp Revert 90858 90875 and 90805 for now. 2009-12-08 23:21:45 +00:00
DomPrinter.cpp Remove ShortNames from getNodeLabel in DOTGraphTraits 2009-11-30 12:38:47 +00:00
InlineCost.cpp Add a missing closing parenthesis, and tweak to fit in 80 2009-11-01 19:12:43 +00:00
InstCount.cpp Remove FreeInst. 2009-10-26 23:43:48 +00:00
InstructionSimplify.cpp factor some logic out of instcombine into a new SimplifyAddInst method. 2009-11-27 17:42:22 +00:00
Interval.cpp Change Pass::print to take a raw ostream instead of std::ostream, 2009-08-23 06:03:38 +00:00
IntervalPartition.cpp Change Pass::print to take a raw ostream instead of std::ostream, 2009-08-23 06:03:38 +00:00
IVUsers.cpp enable iv-users simplification by default 2009-11-23 23:25:54 +00:00
LazyValueInfo.cpp typo spotted by duncan. 2009-11-16 03:51:42 +00:00
LibCallAliasAnalysis.cpp LibCallAliasAnalysis doesn't use TargetData. 2009-07-31 20:56:29 +00:00
LibCallSemantics.cpp Remove Value::getNameLen 2009-07-26 08:34:35 +00:00
LiveValues.cpp remove redundant foward declaration. This function is already in 2009-11-11 00:21:21 +00:00
LoopDependenceAnalysis.cpp remove a few dead insertion methods. 2009-08-24 02:39:26 +00:00
LoopInfo.cpp Teach getSmallConstantTripMultiple about Shl operators. 2009-11-20 01:09:34 +00:00
LoopPass.cpp Fix this debug output to handle the case where the loop has been deleted. 2009-09-28 15:40:01 +00:00
Makefile Removed trailing whitespace from Makefiles. 2009-01-09 16:44:42 +00:00
MemoryBuiltins.cpp Simplify ComputeMultiple so that it doesn't depend on TargetData. 2009-11-18 00:58:27 +00:00
MemoryDependenceAnalysis.cpp Switch GVN and memdep to use PHITransAddr, which correctly handles 2009-12-09 01:59:31 +00:00
PHITransAddr.cpp fix a nasty variable that was shadowing the real CurBB but with the wrong value. 2009-12-09 01:19:16 +00:00
PointerTracking.cpp remove a bunch of extraneous LLVMContext arguments 2009-11-06 04:27:31 +00:00
PostDominators.cpp Change Pass::print to take a raw ostream instead of std::ostream, 2009-08-23 06:03:38 +00:00
ProfileEstimatorPass.cpp Fix MSVC build. 2009-12-03 13:23:03 +00:00
ProfileInfo.cpp Converted ProfileInfo to template, added more API for ProfileInfo-preserving. 2009-12-03 09:30:12 +00:00
ProfileInfoLoader.cpp Reapplied r81355 with the problems fixed. 2009-09-16 11:35:50 +00:00
ProfileInfoLoaderPass.cpp Use ProfileInfo-API in ProfileInfo Loader and do more assertions. 2009-12-03 11:00:37 +00:00
ProfileVerifierPass.cpp Convert ProfileVerifier to template so it can be used for different types of ProfileInfo. 2009-12-03 12:55:57 +00:00
README.txt Create a README.txt for lib/Analysis, and add an entry. 2009-09-28 18:38:53 +00:00
ScalarEvolution.cpp Remove dead LLVMContext argument. 2009-11-23 03:26:09 +00:00
ScalarEvolutionAliasAnalysis.cpp Make ScalarEvolutionAliasAnalysis slightly more aggressive, by making an 2009-10-31 14:32:25 +00:00
ScalarEvolutionExpander.cpp Fix a comment typo. 2009-12-04 01:33:04 +00:00
SparsePropagation.cpp rename indbr -> indirectbr to appease the residents of #llvm. 2009-10-28 00:19:10 +00:00
Trace.cpp eliminate the "Value" printing methods that print to a std::ostream. 2009-08-23 04:37:46 +00:00
ValueTracking.cpp Fixed an assertion failure for tracking sext of a vector of integers 2009-12-02 04:59:58 +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.

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