mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-12 15:05:06 +00:00
6b980541df
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 |
||
---|---|---|
.. | ||
AliasAnalysis.h | ||
AliasSetTracker.h | ||
BlockFrequencyImpl.h | ||
BlockFrequencyInfo.h | ||
BranchProbabilityInfo.h | ||
CallGraph.h | ||
CaptureTracking.h | ||
CFGPrinter.h | ||
CodeMetrics.h | ||
ConstantFolding.h | ||
ConstantsScanner.h | ||
DebugInfo.h | ||
DIBuilder.h | ||
DominanceFrontier.h | ||
DominatorInternals.h | ||
Dominators.h | ||
DomPrinter.h | ||
DOTGraphTraitsPass.h | ||
FindUsedTypes.h | ||
InlineCost.h | ||
InstructionSimplify.h | ||
Interval.h | ||
IntervalIterator.h | ||
IntervalPartition.h | ||
IVUsers.h | ||
LazyValueInfo.h | ||
LibCallAliasAnalysis.h | ||
LibCallSemantics.h | ||
Lint.h | ||
Loads.h | ||
LoopDependenceAnalysis.h | ||
LoopInfo.h | ||
LoopIterator.h | ||
LoopPass.h | ||
MemoryBuiltins.h | ||
MemoryDependenceAnalysis.h | ||
Passes.h | ||
PathNumbering.h | ||
PathProfileInfo.h | ||
PHITransAddr.h | ||
PostDominators.h | ||
ProfileInfo.h | ||
ProfileInfoLoader.h | ||
ProfileInfoTypes.h | ||
RegionInfo.h | ||
RegionIterator.h | ||
RegionPass.h | ||
RegionPrinter.h | ||
ScalarEvolution.h | ||
ScalarEvolutionExpander.h | ||
ScalarEvolutionExpressions.h | ||
ScalarEvolutionNormalization.h | ||
SparsePropagation.h | ||
Trace.h | ||
ValueTracking.h | ||
Verifier.h |