• Home
Name
Date
Size
#Lines
LOC

..--

AsmPrinter/03-May-2024-18,51112,001

GlobalISel/03-May-2024-2,0411,379

MIRParser/03-May-2024-3,8413,188

SelectionDAG/03-May-2024-69,48149,257

AggressiveAntiDepBreaker.cppD03-May-202436.3 KiB999673

AggressiveAntiDepBreaker.hD03-May-20246.7 KiB18083

AllocationOrder.cppD03-May-20241.9 KiB5533

AllocationOrder.hD03-May-20242.8 KiB9045

Analysis.cppD03-May-202429.3 KiB732448

Android.bpD03-May-2024469 1916

AntiDepBreaker.hD03-May-20242.5 KiB6832

AtomicExpandPass.cppD03-May-202464.3 KiB1,6411,081

BasicTargetTransformInfo.cppD03-May-20241.6 KiB3916

BranchFolding.cppD03-May-202471 KiB1,9201,274

BranchFolding.hD03-May-20245.6 KiB161129

BuiltinGCs.cppD03-May-20245.1 KiB14069

CMakeLists.txtD03-May-20243.5 KiB155150

CalcSpillWeights.cppD03-May-20247.8 KiB237162

CallingConvLower.cppD03-May-202410.3 KiB288221

CodeGen.cppD03-May-20243.8 KiB9677

CodeGenPrepare.cppD03-May-2024209.5 KiB5,6573,379

CriticalAntiDepBreaker.cppD03-May-202427 KiB682382

CriticalAntiDepBreaker.hD03-May-20244.1 KiB10754

DFAPacketizer.cppD03-May-202411.3 KiB326198

DeadMachineInstructionElim.cppD03-May-20246.4 KiB182112

DetectDeadLanes.cppD03-May-202420.8 KiB603443

DwarfEHPrepare.cppD03-May-20248.6 KiB265185

EarlyIfConversion.cppD03-May-202428.6 KiB818520

EdgeBundles.cppD03-May-20243 KiB9866

ExecutionDepsFix.cppD03-May-202426.3 KiB812532

ExpandISelPseudos.cppD03-May-20242.5 KiB7546

ExpandPostRAPseudos.cppD03-May-20247.1 KiB228158

FaultMaps.cppD03-May-20244.7 KiB151102

FuncletLayout.cppD03-May-20242 KiB6038

GCMetadata.cppD03-May-20245.2 KiB178122

GCMetadataPrinter.cppD03-May-2024649 204

GCRootLowering.cppD03-May-202412.1 KiB356233

GCStrategy.cppD03-May-2024807 236

GlobalMerge.cppD03-May-202422.1 KiB606345

IfConversion.cppD03-May-202467.6 KiB1,8451,228

ImplicitNullChecks.cppD03-May-202419.5 KiB577316

InlineSpiller.cppD03-May-202453.6 KiB1,457985

InterferenceCache.cppD03-May-20248.4 KiB251189

InterferenceCache.hD03-May-20247 KiB239121

InterleavedAccessPass.cppD03-May-202412.8 KiB387213

IntrinsicLowering.cppD03-May-202422 KiB609516

LLVMBuild.txtD03-May-2024864 2623

LLVMTargetMachine.cppD03-May-202411.1 KiB312206

LatencyPriorityQueue.cppD03-May-20245.2 KiB14178

LexicalScopes.cppD03-May-202411.3 KiB333240

LiveDebugValues.cppD03-May-202418.5 KiB517348

LiveDebugVariables.cppD03-May-202435.8 KiB1,048751

LiveDebugVariables.hD03-May-20242.5 KiB7628

LiveInterval.cppD03-May-202439.6 KiB1,251823

LiveIntervalAnalysis.cppD03-May-202458.2 KiB1,5761,105

LiveIntervalUnion.cppD03-May-20246.5 KiB206130

LivePhysRegs.cppD03-May-20246.1 KiB190132

LiveRangeCalc.cppD03-May-202416.7 KiB485319

LiveRangeCalc.hD03-May-202410.1 KiB24961

LiveRangeEdit.cppD03-May-202415.7 KiB450323

LiveRangeUtils.hD03-May-20242.1 KiB6336

LiveRegMatrix.cppD03-May-20246.6 KiB198143

LiveStackAnalysis.cppD03-May-20243 KiB8959

LiveVariables.cppD03-May-202429.1 KiB811544

LocalStackSlotAllocation.cppD03-May-202416.5 KiB421267

LowerEmuTLS.cppD03-May-20245.7 KiB163113

MIRPrinter.cppD03-May-202432.5 KiB1,006887

MIRPrinter.hD03-May-20241 KiB3410

MIRPrintingPass.cppD03-May-20242 KiB7241

MachineBasicBlock.cppD03-May-202445 KiB1,290905

MachineBlockFrequencyInfo.cppD03-May-20246.9 KiB201151

MachineBlockPlacement.cppD03-May-202472.1 KiB1,7761,034

MachineBranchProbabilityInfo.cppD03-May-20243.2 KiB9463

MachineCSE.cppD03-May-202425.2 KiB717508

MachineCombiner.cppD03-May-202419.1 KiB478312

MachineCopyPropagation.cppD03-May-202412.5 KiB372233

MachineDominanceFrontier.cppD03-May-20241.7 KiB5534

MachineDominators.cppD03-May-20244.9 KiB15895

MachineFunction.cppD03-May-202436.4 KiB1,008720

MachineFunctionAnalysis.cppD03-May-20241.9 KiB6139

MachineFunctionPass.cppD03-May-20243.3 KiB9059

MachineFunctionPrinterPass.cppD03-May-20242.2 KiB7039

MachineInstr.cppD03-May-202475.7 KiB2,2061,656

MachineInstrBundle.cppD03-May-202410.8 KiB345263

MachineLICM.cppD03-May-202448.1 KiB1,389904

MachineLoopInfo.cppD03-May-20242.9 KiB8559

MachineModuleInfo.cppD03-May-202416 KiB464303

MachineModuleInfoImpls.cppD03-May-20241.5 KiB4519

MachinePassRegistry.cppD03-May-20241.7 KiB5630

MachinePipeliner.cppD03-May-2024147.8 KiB3,9442,906

MachinePostDominators.cppD03-May-20241.7 KiB5630

MachineRegionInfo.cppD03-May-20244.1 KiB14188

MachineRegisterInfo.cppD03-May-202418 KiB530377

MachineSSAUpdater.cppD03-May-202412.8 KiB356226

MachineScheduler.cppD03-May-2024128.2 KiB3,5542,467

MachineSink.cppD03-May-202431 KiB858503

MachineTraceMetrics.cppD03-May-202448.9 KiB1,329950

MachineVerifier.cppD03-May-202473.1 KiB2,0501,619

OptimizePHIs.cppD03-May-20246.3 KiB197132

PHIElimination.cppD03-May-202425.6 KiB653415

PHIEliminationUtils.cppD03-May-20242.2 KiB6032

PHIEliminationUtils.hD03-May-2024944 269

ParallelCG.cppD03-May-20243.7 KiB10065

PatchableFunction.cppD03-May-20243 KiB8960

PeepholeOptimizer.cppD03-May-202473.8 KiB1,9481,092

PostRAHazardRecognizer.cppD03-May-20243.4 KiB9950

PostRASchedulerList.cppD03-May-202424.2 KiB706449

PreISelIntrinsicLowering.cppD03-May-20242.6 KiB9565

ProcessImplicitDefs.cppD03-May-20245.4 KiB169119

PrologEpilogInserter.cppD03-May-202446.8 KiB1,235765

PseudoSourceValue.cppD03-May-20244.3 KiB140100

README.txtD03-May-20246.2 KiB200149

RegAllocBase.cppD03-May-20245.8 KiB162109

RegAllocBase.hD03-May-20244.5 KiB12341

RegAllocBasic.cppD03-May-202410.3 KiB299188

RegAllocFast.cppD03-May-202441.5 KiB1,123807

RegAllocGreedy.cppD03-May-202497 KiB2,6201,639

RegAllocPBQP.cppD03-May-202431.4 KiB894603

RegUsageInfoCollector.cppD03-May-20244.9 KiB14389

RegUsageInfoPropagate.cppD03-May-20244.3 KiB13288

RegisterClassInfo.cppD03-May-20246.3 KiB182119

RegisterCoalescer.cppD03-May-2024115.2 KiB3,0591,905

RegisterCoalescer.hD03-May-20244.2 KiB11740

RegisterPressure.cppD03-May-202447.6 KiB1,3511,029

RegisterScavenging.cppD03-May-202414.5 KiB459326

RegisterUsageInfo.cppD03-May-20242.9 KiB9358

RenameIndependentSubregs.cppD03-May-202414 KiB389270

SafeStack.cppD03-May-202432.4 KiB852585

SafeStackColoring.cppD03-May-20249 KiB292221

SafeStackColoring.hD03-May-20244.6 KiB15088

SafeStackLayout.cppD03-May-20244.7 KiB140105

SafeStackLayout.hD03-May-20242.1 KiB6937

ScheduleDAG.cppD03-May-202419.9 KiB642485

ScheduleDAGInstrs.cppD03-May-202461.3 KiB1,7121,136

ScheduleDAGPrinter.cppD03-May-20243.2 KiB10167

ScoreboardHazardRecognizer.cppD03-May-20247.8 KiB241159

ShadowStackGCLowering.cppD03-May-202417.2 KiB469287

ShrinkWrap.cppD03-May-202420.2 KiB557337

SjLjEHPrepare.cppD03-May-202418.1 KiB481322

SlotIndexes.cppD03-May-20247.9 KiB246160

SpillPlacement.cppD03-May-202412.4 KiB376226

SpillPlacement.hD03-May-20246.6 KiB17164

Spiller.hD03-May-20241.2 KiB4320

SplitKit.cppD03-May-202453.9 KiB1,5261,032

SplitKit.hD03-May-202420.4 KiB504173

StackColoring.cppD03-May-202440.9 KiB1,127630

StackMapLivenessAnalysis.cppD03-May-20246.2 KiB173101

StackMaps.cppD03-May-202418.8 KiB553377

StackProtector.cppD03-May-202417.7 KiB472287

StackSlotColoring.cppD03-May-202415.3 KiB470333

TailDuplication.cppD03-May-20241.9 KiB6636

TailDuplicator.cppD03-May-202433.5 KiB933643

TargetFrameLoweringImpl.cppD03-May-20244 KiB10557

TargetInstrInfo.cppD03-May-202444.2 KiB1,196844

TargetLoweringBase.cppD03-May-202472.7 KiB1,8431,431

TargetLoweringObjectFileImpl.cppD03-May-202437.4 KiB1,099809

TargetOptionsImpl.cppD03-May-20242 KiB5021

TargetPassConfig.cppD03-May-202433.6 KiB889511

TargetRegisterInfo.cppD03-May-202414.6 KiB400279

TargetSchedule.cppD03-May-202411.3 KiB301207

TwoAddressInstructionPass.cppD03-May-202464.3 KiB1,8071,214

UnreachableBlockElim.cppD03-May-20247.3 KiB221153

VirtRegMap.cppD03-May-202416.6 KiB468330

WinEHPrepare.cppD03-May-202449.1 KiB1,236864

XRayInstrumentation.cppD03-May-20243.5 KiB9761

README.txt

1 //===---------------------------------------------------------------------===//
2 
3 Common register allocation / spilling problem:
4 
5         mul lr, r4, lr
6         str lr, [sp, #+52]
7         ldr lr, [r1, #+32]
8         sxth r3, r3
9         ldr r4, [sp, #+52]
10         mla r4, r3, lr, r4
11 
12 can be:
13 
14         mul lr, r4, lr
15         mov r4, lr
16         str lr, [sp, #+52]
17         ldr lr, [r1, #+32]
18         sxth r3, r3
19         mla r4, r3, lr, r4
20 
21 and then "merge" mul and mov:
22 
23         mul r4, r4, lr
24         str r4, [sp, #+52]
25         ldr lr, [r1, #+32]
26         sxth r3, r3
27         mla r4, r3, lr, r4
28 
29 It also increase the likelihood the store may become dead.
30 
31 //===---------------------------------------------------------------------===//
32 
33 bb27 ...
34         ...
35         %reg1037 = ADDri %reg1039, 1
36         %reg1038 = ADDrs %reg1032, %reg1039, %NOREG, 10
37     Successors according to CFG: 0x8b03bf0 (#5)
38 
39 bb76 (0x8b03bf0, LLVM BB @0x8b032d0, ID#5):
40     Predecessors according to CFG: 0x8b0c5f0 (#3) 0x8b0a7c0 (#4)
41         %reg1039 = PHI %reg1070, mbb<bb76.outer,0x8b0c5f0>, %reg1037, mbb<bb27,0x8b0a7c0>
42 
43 Note ADDri is not a two-address instruction. However, its result %reg1037 is an
44 operand of the PHI node in bb76 and its operand %reg1039 is the result of the
45 PHI node. We should treat it as a two-address code and make sure the ADDri is
46 scheduled after any node that reads %reg1039.
47 
48 //===---------------------------------------------------------------------===//
49 
50 Use local info (i.e. register scavenger) to assign it a free register to allow
51 reuse:
52         ldr r3, [sp, #+4]
53         add r3, r3, #3
54         ldr r2, [sp, #+8]
55         add r2, r2, #2
56         ldr r1, [sp, #+4]  <==
57         add r1, r1, #1
58         ldr r0, [sp, #+4]
59         add r0, r0, #2
60 
61 //===---------------------------------------------------------------------===//
62 
63 LLVM aggressively lift CSE out of loop. Sometimes this can be negative side-
64 effects:
65 
66 R1 = X + 4
67 R2 = X + 7
68 R3 = X + 15
69 
70 loop:
71 load [i + R1]
72 ...
73 load [i + R2]
74 ...
75 load [i + R3]
76 
77 Suppose there is high register pressure, R1, R2, R3, can be spilled. We need
78 to implement proper re-materialization to handle this:
79 
80 R1 = X + 4
81 R2 = X + 7
82 R3 = X + 15
83 
84 loop:
85 R1 = X + 4  @ re-materialized
86 load [i + R1]
87 ...
88 R2 = X + 7 @ re-materialized
89 load [i + R2]
90 ...
91 R3 = X + 15 @ re-materialized
92 load [i + R3]
93 
94 Furthermore, with re-association, we can enable sharing:
95 
96 R1 = X + 4
97 R2 = X + 7
98 R3 = X + 15
99 
100 loop:
101 T = i + X
102 load [T + 4]
103 ...
104 load [T + 7]
105 ...
106 load [T + 15]
107 //===---------------------------------------------------------------------===//
108 
109 It's not always a good idea to choose rematerialization over spilling. If all
110 the load / store instructions would be folded then spilling is cheaper because
111 it won't require new live intervals / registers. See 2003-05-31-LongShifts for
112 an example.
113 
114 //===---------------------------------------------------------------------===//
115 
116 With a copying garbage collector, derived pointers must not be retained across
117 collector safe points; the collector could move the objects and invalidate the
118 derived pointer. This is bad enough in the first place, but safe points can
119 crop up unpredictably. Consider:
120 
121         %array = load { i32, [0 x %obj] }** %array_addr
122         %nth_el = getelementptr { i32, [0 x %obj] }* %array, i32 0, i32 %n
123         %old = load %obj** %nth_el
124         %z = div i64 %x, %y
125         store %obj* %new, %obj** %nth_el
126 
127 If the i64 division is lowered to a libcall, then a safe point will (must)
128 appear for the call site. If a collection occurs, %array and %nth_el no longer
129 point into the correct object.
130 
131 The fix for this is to copy address calculations so that dependent pointers
132 are never live across safe point boundaries. But the loads cannot be copied
133 like this if there was an intervening store, so may be hard to get right.
134 
135 Only a concurrent mutator can trigger a collection at the libcall safe point.
136 So single-threaded programs do not have this requirement, even with a copying
137 collector. Still, LLVM optimizations would probably undo a front-end's careful
138 work.
139 
140 //===---------------------------------------------------------------------===//
141 
142 The ocaml frametable structure supports liveness information. It would be good
143 to support it.
144 
145 //===---------------------------------------------------------------------===//
146 
147 The FIXME in ComputeCommonTailLength in BranchFolding.cpp needs to be
148 revisited. The check is there to work around a misuse of directives in inline
149 assembly.
150 
151 //===---------------------------------------------------------------------===//
152 
153 It would be good to detect collector/target compatibility instead of silently
154 doing the wrong thing.
155 
156 //===---------------------------------------------------------------------===//
157 
158 It would be really nice to be able to write patterns in .td files for copies,
159 which would eliminate a bunch of explicit predicates on them (e.g. no side
160 effects).  Once this is in place, it would be even better to have tblgen
161 synthesize the various copy insertion/inspection methods in TargetInstrInfo.
162 
163 //===---------------------------------------------------------------------===//
164 
165 Stack coloring improvements:
166 
167 1. Do proper LiveStackAnalysis on all stack objects including those which are
168    not spill slots.
169 2. Reorder objects to fill in gaps between objects.
170    e.g. 4, 1, <gap>, 4, 1, 1, 1, <gap>, 4 => 4, 1, 1, 1, 1, 4, 4
171 
172 //===---------------------------------------------------------------------===//
173 
174 The scheduler should be able to sort nearby instructions by their address. For
175 example, in an expanded memset sequence it's not uncommon to see code like this:
176 
177   movl $0, 4(%rdi)
178   movl $0, 8(%rdi)
179   movl $0, 12(%rdi)
180   movl $0, 0(%rdi)
181 
182 Each of the stores is independent, and the scheduler is currently making an
183 arbitrary decision about the order.
184 
185 //===---------------------------------------------------------------------===//
186 
187 Another opportunitiy in this code is that the $0 could be moved to a register:
188 
189   movl $0, 4(%rdi)
190   movl $0, 8(%rdi)
191   movl $0, 12(%rdi)
192   movl $0, 0(%rdi)
193 
194 This would save substantial code size, especially for longer sequences like
195 this. It would be easy to have a rule telling isel to avoid matching MOV32mi
196 if the immediate has more than some fixed number of uses. It's more involved
197 to teach the register allocator how to do late folding to recover from
198 excessive register pressure.
199 
200