llvm-6502/lib/Analysis
Chandler Carruth 6b980541df Refactor the interface to recursively simplifying instructions to be tad
bit simpler by handling a common case explicitly.

Also, refactor the implementation to use a worklist based walk of the
recursive users, rather than trying to use value handles to detect and
recover from RAUWs during the recursive descent. This fixes a very
subtle bug in the previous implementation where degenerate control flow
structures could cause mutually recursive instructions (PHI nodes) to
collapse in just such a way that From became equal to To after some
amount of recursion. At that point, we hit the inf-loop that the assert
at the top attempted to guard against. This problem is defined away when
not using value handles in this manner. There are lots of comments
claiming that the WeakVH will protect against just this sort of error,
but they're not accurate about the actual implementation of WeakVHs,
which do still track RAUWs.

I don't have any test case for the bug this fixes because it requires
running the recursive simplification on unreachable phi nodes. I've no
way to either run this or easily write an input that triggers it. It was
found when using instruction simplification inside the inliner when
running over the nightly test-suite.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153393 91177308-0d34-0410-b5e6-96231b3b80d8
2012-03-24 21:11:24 +00:00
..
IPA LLVMBuild: Remove trailing newline, which irked me. 2011-12-12 19:48:00 +00:00
AliasAnalysis.cpp Move isKnownNonNull from private implementation detail of BasicAA to a public 2012-02-25 10:56:28 +00:00
AliasAnalysisCounter.cpp Persuade GCC that there is nothing worth warning about here (there isn't). 2012-02-05 14:20:11 +00:00
AliasAnalysisEvaluator.cpp Remove unnecessary default cases in switches that cover all enum values. 2012-01-10 16:47:17 +00:00
AliasDebugger.cpp
AliasSetTracker.cpp Have AliasSet::aliasesUnknownInst use pointer TBAA info when available 2012-02-10 15:52:39 +00:00
Analysis.cpp
BasicAliasAnalysis.cpp Duncan pointed out that if the alignment isn't explicitly specified, it defaults to the ABI alignment. Given that, make this code a bit more aggressive in such cases. 2012-02-27 23:16:46 +00:00
BlockFrequencyInfo.cpp Add some constantness to BranchProbabilityInfo and BlockFrequnencyInfo. 2011-12-20 20:03:10 +00:00
BranchProbabilityInfo.cpp Make the unreachable probability much much heavier. The previous 2011-12-22 09:26:37 +00:00
CaptureTracking.cpp Move includes to the .cpp file. 2012-01-17 22:16:31 +00:00
CFGPrinter.cpp
CMakeLists.txt Pull the implementation of the code metrics out of the inline cost 2012-03-16 05:51:52 +00:00
CodeMetrics.cpp Pull the implementation of the code metrics out of the inline cost 2012-03-16 05:51:52 +00:00
ConstantFolding.cpp Convert assert(0) to llvm_unreachable 2012-02-07 05:05:23 +00:00
DbgInfoPrinter.cpp
DebugInfo.cpp Do the right thing on NULL uint64 fields. 2012-03-16 00:21:54 +00:00
DIBuilder.cpp Add support for runtime languages on our forward declarations. 2012-02-20 18:04:14 +00:00
DominanceFrontier.cpp Unweaken vtables as per http://llvm.org/docs/CodingStandards.html#ll_virtual_anch 2011-12-20 02:50:00 +00:00
DomPrinter.cpp remove the blank line from previous ci. 2012-02-04 03:18:47 +00:00
InlineCost.cpp Start removing the use of an ad-hoc 'never inline' set and instead 2012-03-16 06:10:13 +00:00
InstCount.cpp
InstructionSimplify.cpp Refactor the interface to recursively simplifying instructions to be tad 2012-03-24 21:11:24 +00:00
Interval.cpp
IntervalPartition.cpp
IVUsers.cpp Cleanup IVUsers::addUsersIfInteresting. 2012-03-22 17:47:33 +00:00
LazyValueInfo.cpp llvm::SwitchInst 2012-03-11 06:09:17 +00:00
LibCallAliasAnalysis.cpp
LibCallSemantics.cpp
Lint.cpp Fix a few more places where TargetData/TargetLibraryInfo is not being passed. 2011-12-02 01:26:24 +00:00
LLVMBuild.txt LLVMBuild: Introduce a common section which currently has a list of the 2011-12-12 22:45:54 +00:00
Loads.cpp enhance jump threading to preserve TBAA information when PRE'ing loads, 2012-03-13 18:07:41 +00:00
LoopDependenceAnalysis.cpp More dead code removal (using -Wunreachable-code) 2012-01-20 21:51:11 +00:00
LoopInfo.cpp Move Instruction::isSafeToSpeculativelyExecute out of VMCore and 2011-12-14 23:49:11 +00:00
LoopPass.cpp Take out the debug info probe stuff. It's making some changes to 2012-03-23 03:54:05 +00:00
Makefile
MemDepPrinter.cpp Fix a stupid typo in MemDepPrinter. 2011-12-14 02:54:39 +00:00
MemoryBuiltins.cpp
MemoryDependenceAnalysis.cpp Don't call dominates on unreachable instructions. Should fix the dragonegg 2012-02-26 05:30:08 +00:00
ModuleDebugInfoPrinter.cpp
NoAliasAnalysis.cpp
PathNumbering.cpp [unwind removal] We no longer have 'unwind' instructions being generated, so 2012-02-06 21:16:41 +00:00
PathProfileInfo.cpp
PathProfileVerifier.cpp
PHITransAddr.cpp Uniformize the InstructionSimplify interface by ensuring that all routines 2012-03-13 11:42:19 +00:00
PostDominators.cpp
ProfileEstimatorPass.cpp
ProfileInfo.cpp
ProfileInfoLoader.cpp
ProfileInfoLoaderPass.cpp
ProfileVerifierPass.cpp Move code into anonymous namespaces. 2011-11-26 23:01:57 +00:00
README.txt
RegionInfo.cpp Remove extra semi-colons. 2012-02-22 17:25:00 +00:00
RegionPass.cpp
RegionPrinter.cpp
ScalarEvolution.cpp switch SCEV to use the new ConstantFoldLoadThroughGEPIndices function 2012-01-24 05:49:24 +00:00
ScalarEvolutionAliasAnalysis.cpp
ScalarEvolutionExpander.cpp Fix this assert. IP can point to an instruction with strange dominance 2012-02-27 02:13:03 +00:00
ScalarEvolutionNormalization.cpp More dead code removal (using -Wunreachable-code) 2012-01-20 21:51:11 +00:00
SparsePropagation.cpp Taken into account Duncan's comments for r149481 dated by 2nd Feb 2012: 2012-03-08 07:06:20 +00:00
Trace.cpp
TypeBasedAliasAnalysis.cpp
ValueTracking.cpp Factor out the multiply analysis code in ComputeMaskedBits and apply it to the 2012-03-18 23:28:48 +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))

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