llvm-6502/lib/Analysis
Rafael Espindola 356deb5ecd Use DataLayout from the module when easily available.
Eventually DataLayoutPass should go away, but for now that is the only easy
way to get a DataLayout in some APIs. This patch only changes the ones that
have easy access to a Module.

One interesting issue with sometimes using DataLayoutPass and sometimes
fetching it from the Module is that we have to make sure they are equivalent.
We can get most of the way there by always constructing the pass with a Module.
In fact, the pass could be changed to point to an external DataLayout instead
of owning one to make this stricter.

Unfortunately, the C api passes a DataLayout, so it has to be up to the caller
to make sure the pass and the module are in sync.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202204 91177308-0d34-0410-b5e6-96231b3b80d8
2014-02-25 23:25:17 +00:00
..
IPA Use DataLayout from the module when easily available. 2014-02-25 23:25:17 +00:00
AliasAnalysis.cpp Make DataLayout a plain object, not a pass. 2014-02-25 17:30:31 +00:00
AliasAnalysisCounter.cpp
AliasAnalysisEvaluator.cpp
AliasDebugger.cpp
AliasSetTracker.cpp
Analysis.cpp
BasicAliasAnalysis.cpp Rename a few more DataLayout variables from TD to DL. 2014-02-21 18:34:28 +00:00
BlockFrequencyInfo.cpp
BranchProbabilityInfo.cpp
CaptureTracking.cpp
CFG.cpp
CFGPrinter.cpp Replace the F_Binary flag with a F_Text one. 2014-02-24 18:20:12 +00:00
CMakeLists.txt
CodeMetrics.cpp
ConstantFolding.cpp
CostModel.cpp
Delinearization.cpp
DependenceAnalysis.cpp normalize the last delinearized dimension 2014-02-21 18:15:11 +00:00
DominanceFrontier.cpp
DomPrinter.cpp
InstCount.cpp
InstructionSimplify.cpp Rename many DataLayout variables from TD to DL. 2014-02-21 00:06:31 +00:00
Interval.cpp
IntervalPartition.cpp
IVUsers.cpp Make DataLayout a plain object, not a pass. 2014-02-25 17:30:31 +00:00
LazyCallGraph.cpp
LazyValueInfo.cpp Make DataLayout a plain object, not a pass. 2014-02-25 17:30:31 +00:00
LibCallAliasAnalysis.cpp
LibCallSemantics.cpp
Lint.cpp Make DataLayout a plain object, not a pass. 2014-02-25 17:30:31 +00:00
LLVMBuild.txt
Loads.cpp
LoopInfo.cpp
LoopPass.cpp
Makefile
MemDepPrinter.cpp
MemoryBuiltins.cpp
MemoryDependenceAnalysis.cpp Make DataLayout a plain object, not a pass. 2014-02-25 17:30:31 +00:00
ModuleDebugInfoPrinter.cpp
NoAliasAnalysis.cpp Make DataLayout a plain object, not a pass. 2014-02-25 17:30:31 +00:00
PHITransAddr.cpp Rename some member variables from TD to DL. 2014-02-18 15:33:12 +00:00
PostDominators.cpp
PtrUseVisitor.cpp
README.txt
RegionInfo.cpp
RegionPass.cpp
RegionPrinter.cpp
ScalarEvolution.cpp Make DataLayout a plain object, not a pass. 2014-02-25 17:30:31 +00:00
ScalarEvolutionAliasAnalysis.cpp
ScalarEvolutionExpander.cpp Rename some member variables from TD to DL. 2014-02-18 15:33:12 +00:00
ScalarEvolutionNormalization.cpp
SparsePropagation.cpp
TargetTransformInfo.cpp Make DataLayout a plain object, not a pass. 2014-02-25 17:30:31 +00:00
Trace.cpp
TypeBasedAliasAnalysis.cpp
ValueTracking.cpp

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

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