You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hmz007 36ed224bac
Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a)
1 year ago
..
AsmPrinter Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
GlobalISel Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MIRParser Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SelectionDAG Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
AggressiveAntiDepBreaker.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
AggressiveAntiDepBreaker.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
AllocationOrder.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
AllocationOrder.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
Analysis.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
Android.bp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
AntiDepBreaker.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
AtomicExpandPass.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
BasicTargetTransformInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
BranchFolding.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
BranchFolding.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
BuiltinGCs.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
CMakeLists.txt Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
CalcSpillWeights.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
CallingConvLower.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
CodeGen.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
CodeGenPrepare.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
CriticalAntiDepBreaker.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
CriticalAntiDepBreaker.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
DFAPacketizer.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
DeadMachineInstructionElim.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
DetectDeadLanes.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
DwarfEHPrepare.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
EarlyIfConversion.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
EdgeBundles.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ExecutionDepsFix.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ExpandISelPseudos.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ExpandPostRAPseudos.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
FaultMaps.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
FuncletLayout.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
GCMetadata.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
GCMetadataPrinter.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
GCRootLowering.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
GCStrategy.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
GlobalMerge.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
IfConversion.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ImplicitNullChecks.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
InlineSpiller.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
InterferenceCache.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
InterferenceCache.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
InterleavedAccessPass.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
IntrinsicLowering.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LLVMBuild.txt Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LLVMTargetMachine.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LatencyPriorityQueue.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LexicalScopes.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveDebugValues.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveDebugVariables.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveDebugVariables.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveInterval.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveIntervalAnalysis.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveIntervalUnion.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LivePhysRegs.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveRangeCalc.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveRangeCalc.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveRangeEdit.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveRangeUtils.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveRegMatrix.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveStackAnalysis.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LiveVariables.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LocalStackSlotAllocation.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
LowerEmuTLS.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MIRPrinter.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MIRPrinter.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MIRPrintingPass.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineBasicBlock.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineBlockFrequencyInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineBlockPlacement.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineBranchProbabilityInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineCSE.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineCombiner.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineCopyPropagation.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineDominanceFrontier.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineDominators.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineFunction.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineFunctionAnalysis.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineFunctionPass.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineFunctionPrinterPass.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineInstr.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineInstrBundle.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineLICM.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineLoopInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineModuleInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineModuleInfoImpls.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachinePassRegistry.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachinePipeliner.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachinePostDominators.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineRegionInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineRegisterInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineSSAUpdater.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineScheduler.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineSink.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineTraceMetrics.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MachineVerifier.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
OptimizePHIs.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PHIElimination.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PHIEliminationUtils.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PHIEliminationUtils.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ParallelCG.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PatchableFunction.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PeepholeOptimizer.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PostRAHazardRecognizer.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PostRASchedulerList.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PreISelIntrinsicLowering.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ProcessImplicitDefs.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PrologEpilogInserter.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PseudoSourceValue.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
README.txt Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegAllocBase.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegAllocBase.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegAllocBasic.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegAllocFast.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegAllocGreedy.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegAllocPBQP.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegUsageInfoCollector.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegUsageInfoPropagate.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegisterClassInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegisterCoalescer.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegisterCoalescer.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegisterPressure.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegisterScavenging.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RegisterUsageInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
RenameIndependentSubregs.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SafeStack.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SafeStackColoring.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SafeStackColoring.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SafeStackLayout.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SafeStackLayout.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ScheduleDAG.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ScheduleDAGInstrs.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ScheduleDAGPrinter.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ScoreboardHazardRecognizer.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ShadowStackGCLowering.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
ShrinkWrap.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SjLjEHPrepare.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SlotIndexes.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SpillPlacement.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SpillPlacement.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
Spiller.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SplitKit.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SplitKit.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
StackColoring.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
StackMapLivenessAnalysis.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
StackMaps.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
StackProtector.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
StackSlotColoring.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TailDuplication.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TailDuplicator.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TargetFrameLoweringImpl.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TargetInstrInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TargetLoweringBase.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TargetLoweringObjectFileImpl.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TargetOptionsImpl.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TargetPassConfig.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TargetRegisterInfo.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TargetSchedule.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TwoAddressInstructionPass.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
UnreachableBlockElim.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
VirtRegMap.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
WinEHPrepare.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
XRayInstrumentation.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago

README.txt

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

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.