llvm/lib/CodeGen
Chandler Carruth 9146833fa3 [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible
with the new pass manager, and no longer relying on analysis groups.

This builds essentially a ground-up new AA infrastructure stack for
LLVM. The core ideas are the same that are used throughout the new pass
manager: type erased polymorphism and direct composition. The design is
as follows:

- FunctionAAResults is a type-erasing alias analysis results aggregation
  interface to walk a single query across a range of results from
  different alias analyses. Currently this is function-specific as we
  always assume that aliasing queries are *within* a function.

- AAResultBase is a CRTP utility providing stub implementations of
  various parts of the alias analysis result concept, notably in several
  cases in terms of other more general parts of the interface. This can
  be used to implement only a narrow part of the interface rather than
  the entire interface. This isn't really ideal, this logic should be
  hoisted into FunctionAAResults as currently it will cause
  a significant amount of redundant work, but it faithfully models the
  behavior of the prior infrastructure.

- All the alias analysis passes are ported to be wrapper passes for the
  legacy PM and new-style analysis passes for the new PM with a shared
  result object. In some cases (most notably CFL), this is an extremely
  naive approach that we should revisit when we can specialize for the
  new pass manager.

- BasicAA has been restructured to reflect that it is much more
  fundamentally a function analysis because it uses dominator trees and
  loop info that need to be constructed for each function.

All of the references to getting alias analysis results have been
updated to use the new aggregation interface. All the preservation and
other pass management code has been updated accordingly.

The way the FunctionAAResultsWrapperPass works is to detect the
available alias analyses when run, and add them to the results object.
This means that we should be able to continue to respect when various
passes are added to the pipeline, for example adding CFL or adding TBAA
passes should just cause their results to be available and to get folded
into this. The exception to this rule is BasicAA which really needs to
be a function pass due to using dominator trees and loop info. As
a consequence, the FunctionAAResultsWrapperPass directly depends on
BasicAA and always includes it in the aggregation.

This has significant implications for preserving analyses. Generally,
most passes shouldn't bother preserving FunctionAAResultsWrapperPass
because rebuilding the results just updates the set of known AA passes.
The exception to this rule are LoopPass instances which need to preserve
all the function analyses that the loop pass manager will end up
needing. This means preserving both BasicAAWrapperPass and the
aggregating FunctionAAResultsWrapperPass.

Now, when preserving an alias analysis, you do so by directly preserving
that analysis. This is only necessary for non-immutable-pass-provided
alias analyses though, and there are only three of interest: BasicAA,
GlobalsAA (formerly GlobalsModRef), and SCEVAA. Usually BasicAA is
preserved when needed because it (like DominatorTree and LoopInfo) is
marked as a CFG-only pass. I've expanded GlobalsAA into the preserved
set everywhere we previously were preserving all of AliasAnalysis, and
I've added SCEVAA in the intersection of that with where we preserve
SCEV itself.

One significant challenge to all of this is that the CGSCC passes were
actually using the alias analysis implementations by taking advantage of
a pretty amazing set of loop holes in the old pass manager's analysis
management code which allowed analysis groups to slide through in many
cases. Moving away from analysis groups makes this problem much more
obvious. To fix it, I've leveraged the flexibility the design of the new
PM components provides to just directly construct the relevant alias
analyses for the relevant functions in the IPO passes that need them.
This is a bit hacky, but should go away with the new pass manager, and
is already in many ways cleaner than the prior state.

Another significant challenge is that various facilities of the old
alias analysis infrastructure just don't fit any more. The most
significant of these is the alias analysis 'counter' pass. That pass
relied on the ability to snoop on AA queries at different points in the
analysis group chain. Instead, I'm planning to build printing
functionality directly into the aggregation layer. I've not included
that in this patch merely to keep it smaller.

Note that all of this needs a nearly complete rewrite of the AA
documentation. I'm planning to do that, but I'd like to make sure the
new design settles, and to flesh out a bit more of what it looks like in
the new pass manager first.

Differential Revision: http://reviews.llvm.org/D12080

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247167 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-09 17:55:00 +00:00
..
AsmPrinter [WinEH] Emit prologues and epilogues for funclets 2015-09-08 22:44:41 +00:00
MIRParser [WinEH] Add some support for code generating catchpad 2015-08-27 23:27:47 +00:00
SelectionDAG [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
AggressiveAntiDepBreaker.cpp [AggressiveAntiDepBreaker] Check for EarlyClobber on defining instruction 2015-08-31 07:51:36 +00:00
AggressiveAntiDepBreaker.h [CodeGen] Reduce visibility of implementation details 2015-07-01 14:47:39 +00:00
AllocationOrder.cpp TargetRegisterInfo: Provide a way to check assigned registers in getRegAllocationHints() 2015-07-15 22:16:00 +00:00
AllocationOrder.h TargetRegisterInfo: Provide a way to check assigned registers in getRegAllocationHints() 2015-07-15 22:16:00 +00:00
Analysis.cpp Revert r246232 and r246304. 2015-08-28 21:13:39 +00:00
AntiDepBreaker.h [CodeGen] Reduce visibility of implementation details 2015-07-01 14:47:39 +00:00
AtomicExpandPass.cpp Fix an alignment error in llvm::expandAtomicRMWToCmpXchg without breaking the build where X86 isn't enabled. 2015-08-06 16:55:03 +00:00
BasicTargetTransformInfo.cpp Make TargetTransformInfo keeping a reference to the Module DataLayout 2015-07-09 02:08:42 +00:00
BranchFolding.cpp [WinEH] Add some support for code generating catchpad 2015-08-27 23:27:47 +00:00
BranchFolding.h [CodeGen] Reduce visibility of implementation details 2015-07-01 14:47:39 +00:00
CalcSpillWeights.cpp Trace copies when checking for rematerializability in spill weight calculation 2015-08-10 11:59:44 +00:00
CallingConvLower.cpp remove function names from comments; NFC 2015-06-11 14:26:49 +00:00
CMakeLists.txt Fix shared library build. 2015-08-29 22:34:34 +00:00
CodeGen.cpp [CodeGen] Add a pass to fold null checks into nearby memory operations. 2015-06-15 18:44:27 +00:00
CodeGenPrepare.cpp use "unpredictable" metadata in fast-isel when splitting compares 2015-09-02 19:23:23 +00:00
CoreCLRGC.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
CriticalAntiDepBreaker.cpp MachineBasicBlock: Add liveins() method returning an iterator_range 2015-08-24 22:59:52 +00:00
CriticalAntiDepBreaker.h [CodeGen] Reduce visibility of implementation details 2015-07-01 14:47:39 +00:00
DeadMachineInstructionElim.cpp MachineBasicBlock: Add liveins() method returning an iterator_range 2015-08-24 22:59:52 +00:00
DFAPacketizer.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
DwarfEHPrepare.cpp Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
EarlyIfConversion.cpp Avoid redundant select node in early if-conversion pass 2015-06-18 22:34:09 +00:00
EdgeBundles.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
ErlangGC.cpp
ExecutionDepsFix.cpp MachineBasicBlock: Add liveins() method returning an iterator_range 2015-08-24 22:59:52 +00:00
ExpandISelPseudos.cpp
ExpandPostRAPseudos.cpp
FaultMaps.cpp Revert "[FaultMaps] Move FaultMapParser to Object/" 2015-06-23 20:09:03 +00:00
GCMetadata.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
GCMetadataPrinter.cpp
GCRootLowering.cpp Remove redundant TargetFrameLowering::getFrameIndexOffset virtual 2015-08-15 02:32:35 +00:00
GCStrategy.cpp
GlobalMerge.cpp Fix dropped conditional in cleanup in r245752 2015-08-25 17:01:36 +00:00
IfConversion.cpp Revert r244154 which causes some build failure. See https://llvm.org/bugs/show_bug.cgi?id=24377. 2015-08-06 18:17:29 +00:00
ImplicitNullChecks.cpp Introduce enum value for previously defined metadata -- make.implicit 2015-08-04 04:41:34 +00:00
InlineSpiller.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
InterferenceCache.cpp
InterferenceCache.h [CodeGen] Reduce visibility of implementation details 2015-07-01 14:47:39 +00:00
InterleavedAccessPass.cpp [ARM][AArch64] Turn on by default interleaved access lowering 2015-09-01 11:12:35 +00:00
IntrinsicLowering.cpp
LatencyPriorityQueue.cpp
LexicalScopes.cpp IR: Give 'DI' prefix to debug info metadata 2015-04-29 16:38:44 +00:00
LiveDebugVariables.cpp IR: Give 'DI' prefix to debug info metadata 2015-04-29 16:38:44 +00:00
LiveDebugVariables.h [CodeGen] Reduce visibility of implementation details 2015-07-01 14:47:39 +00:00
LiveInterval.cpp LiveInterval: Document and enforce rules about empty subranges. 2015-07-16 18:55:35 +00:00
LiveIntervalAnalysis.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
LiveIntervalUnion.cpp
LivePhysRegs.cpp Typo. NFC. 2015-09-04 12:34:55 +00:00
LiveRangeCalc.cpp LiveRangeCalc: Improve error messages on malformed IR 2015-05-11 18:47:47 +00:00
LiveRangeCalc.h
LiveRangeEdit.cpp Trace copies when checking for rematerializability in spill weight calculation 2015-08-10 11:59:44 +00:00
LiveRegMatrix.cpp MachineRegisterInfo: Remove UsedPhysReg infrastructure 2015-07-14 17:52:07 +00:00
LiveStackAnalysis.cpp
LiveVariables.cpp [WinEH] Add some support for code generating catchpad 2015-08-27 23:27:47 +00:00
LLVMBuild.txt LLVMCodeGen: Update libdeps corresponding to r246236. 2015-08-28 05:38:49 +00:00
LLVMTargetMachine.cpp llc: Add a 'run-pass' option. 2015-07-06 17:44:26 +00:00
LocalStackSlotAllocation.cpp
MachineBasicBlock.cpp [WinEH] Add some support for code generating catchpad 2015-08-27 23:27:47 +00:00
MachineBlockFrequencyInfo.cpp Rename doFunction() in BFI to calculate() and change its parameters from pointers to references. 2015-07-15 19:58:26 +00:00
MachineBlockPlacement.cpp [WinEH] Add some support for code generating catchpad 2015-08-27 23:27:47 +00:00
MachineBranchProbabilityInfo.cpp Revert r244154 which causes some build failure. See https://llvm.org/bugs/show_bug.cgi?id=24377. 2015-08-06 18:17:29 +00:00
MachineCombiner.cpp fix minsize detection: minsize attribute implies optimizing for size 2015-08-11 14:31:14 +00:00
MachineCopyPropagation.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
MachineCSE.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
MachineDominanceFrontier.cpp
MachineDominators.cpp Remove macro guards for extern template instantiations. 2015-07-13 17:21:31 +00:00
MachineFunction.cpp Revert "Disable targetdatalayoutcheck" 2015-08-17 10:58:03 +00:00
MachineFunctionAnalysis.cpp MIR Serialization: Connect the machine function analysis pass to the MIR parser. 2015-06-15 20:30:22 +00:00
MachineFunctionPass.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
MachineFunctionPrinterPass.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
MachineInstr.cpp Emit <regmask R1 R2 R3 ...> instead of just <regmask> in IR dumps. 2015-08-19 12:03:04 +00:00
MachineInstrBundle.cpp x86: Emit LAHF/SAHF instead of PUSHF/POPF 2015-08-10 20:59:36 +00:00
MachineLICM.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
MachineLoopInfo.cpp Rename LoopInfo::Analyze() to LoopInfo::analyze() and turn its parameter type to const&. 2015-07-16 18:23:57 +00:00
MachineModuleInfo.cpp [EH] Handle non-Function personalities like unknown personalities 2015-08-31 20:02:16 +00:00
MachineModuleInfoImpls.cpp
MachinePassRegistry.cpp
MachinePostDominators.cpp
MachineRegionInfo.cpp
MachineRegisterInfo.cpp MachineRegisterInfo: Introduce isPhysRegUsed() 2015-08-18 18:54:27 +00:00
MachineScheduler.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
MachineSink.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
MachineSSAUpdater.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
MachineTraceMetrics.cpp fix crash in machine trace metrics due to processing dbg_value instructions (PR24199) 2015-07-23 22:56:53 +00:00
MachineVerifier.cpp MachineVerifier: Check that SlotIndex MBBIndexList is sorted. 2015-09-09 17:49:46 +00:00
Makefile Resubmit r237954 (MIR Serialization: print and parse LLVM IR using MIR format). 2015-05-27 18:02:19 +00:00
MIRPrinter.cpp [WinEH] Add some support for code generating catchpad 2015-08-27 23:27:47 +00:00
MIRPrinter.h MIR Serialization: move the MIR printer out of the MIR printing pass. 2015-06-15 23:52:35 +00:00
MIRPrintingPass.cpp MIR Serialization: move the MIR printer out of the MIR printing pass. 2015-06-15 23:52:35 +00:00
module.modulemap
OcamlGC.cpp
OptimizePHIs.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
ParallelCG.cpp Support: Support LLVM_ENABLE_THREADS=0 in llvm/Support/thread.h. 2015-08-31 00:09:01 +00:00
Passes.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
PeepholeOptimizer.cpp Fix typos / grammar 2015-09-09 00:38:33 +00:00
PHIElimination.cpp [WinEH] Add some support for code generating catchpad 2015-08-27 23:27:47 +00:00
PHIEliminationUtils.cpp [WinEH] Add some support for code generating catchpad 2015-08-27 23:27:47 +00:00
PHIEliminationUtils.h
PostRASchedulerList.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
ProcessImplicitDefs.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
PrologEpilogInserter.cpp [WinEH] Emit prologues and epilogues for funclets 2015-09-08 22:44:41 +00:00
PseudoSourceValue.cpp PseudoSourceValue: Transform the mips subclass to target independent subclasses 2015-08-11 23:23:17 +00:00
README.txt
RegAllocBase.cpp
RegAllocBase.h
RegAllocBasic.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
RegAllocFast.cpp MachineBasicBlock: Add liveins() method returning an iterator_range 2015-08-24 22:59:52 +00:00
RegAllocGreedy.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
RegAllocPBQP.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
RegisterClassInfo.cpp
RegisterCoalescer.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
RegisterCoalescer.h Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
RegisterPressure.cpp Fix some comment typos. 2015-08-08 18:27:36 +00:00
RegisterScavenging.cpp MachineBasicBlock: Add liveins() method returning an iterator_range 2015-08-24 22:59:52 +00:00
ScheduleDAG.cpp
ScheduleDAGInstrs.cpp MachineBasicBlock: Add liveins() method returning an iterator_range 2015-08-24 22:59:52 +00:00
ScheduleDAGPrinter.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
ScoreboardHazardRecognizer.cpp
ShadowStackGC.cpp
ShadowStackGCLowering.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
ShrinkWrap.cpp Rework of the new interface for shrink wrapping 2015-08-31 18:26:45 +00:00
SjLjEHPrepare.cpp Fix __builtin_setjmp in combination with sjlj exception handling. 2015-07-16 22:34:16 +00:00
SlotIndexes.cpp
Spiller.h Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
SpillPlacement.cpp
SpillPlacement.h
SplitKit.cpp
SplitKit.h [CodeGen] Reduce visibility of implementation details 2015-07-01 14:47:39 +00:00
StackColoring.cpp Remove MCInstrItineraries includes in parts that don't use them anymore 2015-05-14 18:01:11 +00:00
StackMapLivenessAnalysis.cpp [StackMap Liveness] Calling the base class' getAnalysisUsage method. NFCI. 2015-07-07 02:05:18 +00:00
StackMaps.cpp Move most user of TargetMachine::getDataLayout to the Module one 2015-07-16 06:11:10 +00:00
StackProtector.cpp Redirect DataLayout from TargetMachine to Module in StackProtector 2015-07-07 23:38:49 +00:00
StackSlotColoring.cpp PseudoSourceValue: Replace global manager with a manager in a machine function. 2015-08-11 23:09:45 +00:00
StatepointExampleGC.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
TailDuplication.cpp MachineBasicBlock: Add liveins() method returning an iterator_range 2015-08-24 22:59:52 +00:00
TargetFrameLoweringImpl.cpp Remove redundant TargetFrameLowering::getFrameIndexOffset virtual 2015-08-15 02:32:35 +00:00
TargetInstrInfo.cpp Align SP adjustment in function getSPAdjust 2015-08-17 22:36:27 +00:00
TargetLoweringBase.cpp [WinEH] Add cleanupendpad instruction 2015-09-03 09:09:43 +00:00
TargetLoweringObjectFileImpl.cpp Sink COFF.h MC include into .cpp files 2015-09-03 16:41:50 +00:00
TargetOptionsImpl.cpp Use function attribute "trap-func-name" and remove TargetOptions::TrapFuncName. 2015-07-02 22:13:27 +00:00
TargetRegisterInfo.cpp Targets: commonize some stack realignment code 2015-07-20 22:51:32 +00:00
TargetSchedule.cpp Use llvm_unreachable() instead of report_fatal_error() if the machine model is incomplete 2015-07-17 17:50:11 +00:00
TwoAddressInstructionPass.cpp [PM/AA] Rebuild LLVM's alias analysis infrastructure in a way compatible 2015-09-09 17:55:00 +00:00
UnreachableBlockElim.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
VirtRegMap.cpp MachineRegisterInfo: Remove UsedPhysReg infrastructure 2015-07-14 17:52:07 +00:00
WinEHPrepare.cpp [WinEH] Add cleanupendpad instruction 2015-09-03 09:09:43 +00:00

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

Common register allocation / spilling problem:

        mul lr, r4, lr
        str lr, [sp, #+52]
        ldr lr, [r1, #+32]
        sxth r3, r3
        ldr r4, [sp, #+52]
        mla r4, r3, lr, r4

can be:

        mul lr, r4, lr
        mov r4, lr
        str lr, [sp, #+52]
        ldr lr, [r1, #+32]
        sxth r3, r3
        mla r4, r3, lr, r4

and then "merge" mul and mov:

        mul r4, r4, lr
        str r4, [sp, #+52]
        ldr lr, [r1, #+32]
        sxth r3, r3
        mla r4, r3, lr, r4

It also increase the likelihood the store may become dead.

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

bb27 ...
        ...
        %reg1037 = ADDri %reg1039, 1
        %reg1038 = ADDrs %reg1032, %reg1039, %NOREG, 10
    Successors according to CFG: 0x8b03bf0 (#5)

bb76 (0x8b03bf0, LLVM BB @0x8b032d0, ID#5):
    Predecessors according to CFG: 0x8b0c5f0 (#3) 0x8b0a7c0 (#4)
        %reg1039 = PHI %reg1070, mbb<bb76.outer,0x8b0c5f0>, %reg1037, mbb<bb27,0x8b0a7c0>

Note ADDri is not a two-address instruction. However, its result %reg1037 is an
operand of the PHI node in bb76 and its operand %reg1039 is the result of the
PHI node. We should treat it as a two-address code and make sure the ADDri is
scheduled after any node that reads %reg1039.

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

Use local info (i.e. register scavenger) to assign it a free register to allow
reuse:
        ldr r3, [sp, #+4]
        add r3, r3, #3
        ldr r2, [sp, #+8]
        add r2, r2, #2
        ldr r1, [sp, #+4]  <==
        add r1, r1, #1
        ldr r0, [sp, #+4]
        add r0, r0, #2

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

LLVM aggressively lift CSE out of loop. Sometimes this can be negative side-
effects:

R1 = X + 4
R2 = X + 7
R3 = X + 15

loop:
load [i + R1]
...
load [i + R2]
...
load [i + R3]

Suppose there is high register pressure, R1, R2, R3, can be spilled. We need
to implement proper re-materialization to handle this:

R1 = X + 4
R2 = X + 7
R3 = X + 15

loop:
R1 = X + 4  @ re-materialized
load [i + R1]
...
R2 = X + 7 @ re-materialized
load [i + R2]
...
R3 = X + 15 @ re-materialized
load [i + R3]

Furthermore, with re-association, we can enable sharing:

R1 = X + 4
R2 = X + 7
R3 = X + 15

loop:
T = i + X
load [T + 4]
...
load [T + 7]
...
load [T + 15]
//===---------------------------------------------------------------------===//

It's not always a good idea to choose rematerialization over spilling. If all
the load / store instructions would be folded then spilling is cheaper because
it won't require new live intervals / registers. See 2003-05-31-LongShifts for
an example.

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

With a copying garbage collector, derived pointers must not be retained across
collector safe points; the collector could move the objects and invalidate the
derived pointer. This is bad enough in the first place, but safe points can
crop up unpredictably. Consider:

        %array = load { i32, [0 x %obj] }** %array_addr
        %nth_el = getelementptr { i32, [0 x %obj] }* %array, i32 0, i32 %n
        %old = load %obj** %nth_el
        %z = div i64 %x, %y
        store %obj* %new, %obj** %nth_el

If the i64 division is lowered to a libcall, then a safe point will (must)
appear for the call site. If a collection occurs, %array and %nth_el no longer
point into the correct object.

The fix for this is to copy address calculations so that dependent pointers
are never live across safe point boundaries. But the loads cannot be copied
like this if there was an intervening store, so may be hard to get right.

Only a concurrent mutator can trigger a collection at the libcall safe point.
So single-threaded programs do not have this requirement, even with a copying
collector. Still, LLVM optimizations would probably undo a front-end's careful
work.

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

The ocaml frametable structure supports liveness information. It would be good
to support it.

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

The FIXME in ComputeCommonTailLength in BranchFolding.cpp needs to be
revisited. The check is there to work around a misuse of directives in inline
assembly.

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

It would be good to detect collector/target compatibility instead of silently
doing the wrong thing.

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

It would be really nice to be able to write patterns in .td files for copies,
which would eliminate a bunch of explicit predicates on them (e.g. no side 
effects).  Once this is in place, it would be even better to have tblgen 
synthesize the various copy insertion/inspection methods in TargetInstrInfo.

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

Stack coloring improvements:

1. Do proper LiveStackAnalysis on all stack objects including those which are
   not spill slots.
2. Reorder objects to fill in gaps between objects.
   e.g. 4, 1, <gap>, 4, 1, 1, 1, <gap>, 4 => 4, 1, 1, 1, 1, 4, 4

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

The scheduler should be able to sort nearby instructions by their address. For
example, in an expanded memset sequence it's not uncommon to see code like this:

  movl $0, 4(%rdi)
  movl $0, 8(%rdi)
  movl $0, 12(%rdi)
  movl $0, 0(%rdi)

Each of the stores is independent, and the scheduler is currently making an
arbitrary decision about the order.

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

Another opportunitiy in this code is that the $0 could be moved to a register:

  movl $0, 4(%rdi)
  movl $0, 8(%rdi)
  movl $0, 12(%rdi)
  movl $0, 0(%rdi)

This would save substantial code size, especially for longer sequences like
this. It would be easy to have a rule telling isel to avoid matching MOV32mi
if the immediate has more than some fixed number of uses. It's more involved
to teach the register allocator how to do late folding to recover from
excessive register pressure.