| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
|
|
|
| |
too small.
If the instruction window is < NumRegs/2, pressure tracking is not
likely to be effective. The scheduler has to process a very large
number of tiny blocks. We want this to be fast.
llvm-svn: 189991
|
|
|
|
| |
llvm-svn: 189990
|
|
|
|
| |
llvm-svn: 189989
|
|
|
|
| |
llvm-svn: 189988
|
|
|
|
|
|
|
|
| |
Register pressure tracking is half the complexity of the
scheduler. It's useful to be able to turn it off for compile time and
performance comparisons.
llvm-svn: 189987
|
|
|
|
|
|
|
|
| |
There was one case that we could hit a DebugValue where I didn't think
to check. DebugValues are evil. No checkinable test case, sorry. It's
an obvious fix.
llvm-svn: 189717
|
|
|
|
|
|
|
| |
This removes all expensive pressure tracking logic from the scheduling
critical path of node comparison.
llvm-svn: 189643
|
|
|
|
|
|
|
| |
Only compare pressure within the same set. When multiple sets are
affected, we prioritize the most constrained set.
llvm-svn: 189641
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
liveness later.
Created SUPressureDiffs array to hold the per node PDiff computed during DAG building.
Added a getUpwardPressureDelta API that will soon replace the old
one. Compute PressureDelta here from the precomputed PressureDiffs.
Updating for liveness will come next.
llvm-svn: 189640
|
|
|
|
| |
llvm-svn: 189635
|
|
|
|
|
|
| |
This should be much more clear now. It's still disabled pending testing.
llvm-svn: 189597
|
|
|
|
|
|
|
|
|
|
|
| |
Estimate the cyclic critical path within a single block loop. If the
acyclic critical path is longer, then the loop will exhaust OOO
resources after some number of iterations. If lag between the acyclic
critical path and cyclic critical path is longer the the time it takes
to issue those loop iterations, then aggressively schedule for
latency.
llvm-svn: 189120
|
|
|
|
|
|
|
|
|
| |
count.
This fixes a pathological compile time problem with very large blocks
and lots of scheduling boundaries.
llvm-svn: 189116
|
|
|
|
| |
llvm-svn: 187895
|
|
|
|
|
|
|
|
|
|
|
| |
When registers must be live throughout the scheduling region, increase
the limit for the register class. Once we exceed the original limit,
they will be spilled, and there's no point further reducing pressure.
This isn't a perfect heuristics but avoids a situation where the
scheduler could become trapped by trying to achieve the impossible.
llvm-svn: 187436
|
|
|
|
| |
llvm-svn: 187435
|
|
|
|
|
|
| |
Consider which set is being increased or decreased before comparing.
llvm-svn: 187110
|
|
|
|
| |
llvm-svn: 187107
|
|
|
|
|
|
| |
parameter of ConvergingScheduler::SchedBoundary::getOtherResourceCount
llvm-svn: 186658
|
|
|
|
|
|
| |
make more sense.
llvm-svn: 186632
|
|
|
|
| |
llvm-svn: 184565
|
|
|
|
| |
llvm-svn: 184564
|
|
|
|
| |
llvm-svn: 184133
|
|
|
|
|
|
| |
A complex, expensive heuristic with little value in the current design.
llvm-svn: 184132
|
|
|
|
| |
llvm-svn: 184130
|
|
|
|
|
|
|
|
| |
This eliminates the MultiPressure scheduling "reason". It was
sensitive to queue order. We don't like being sensitive to queue
order.
llvm-svn: 184129
|
|
|
|
| |
llvm-svn: 184039
|
|
|
|
| |
llvm-svn: 184038
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Replace the ill-defined MinLatency and ILPWindow properties with
with straightforward buffer sizes:
MCSchedMode::MicroOpBufferSize
MCProcResourceDesc::BufferSize
These can be used to more precisely model instruction execution if desired.
Disabled some misched tests temporarily. They'll be reenabled in a few commits.
llvm-svn: 184032
|
|
|
|
|
|
|
| |
"Counts" refer to scaled resource counts within a region. CurrMOps is
simply the number of micro-ops to be issue in the current cycle.
llvm-svn: 184031
|
|
|
|
| |
llvm-svn: 184030
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Heuristics compare the critical path in the scheduled code, called
ExpectedLatency, with the latency of instructions remaining to be
scheduled. There are two ways to look at remaining latency:
(1) Dependent latency includes the latency between unscheduled and
scheduled instructions.
(2) Independent latency is simply the height (bottom-up) or depth
(top-down) of instructions currently in the ready Q.
llvm-svn: 184029
|
|
|
|
| |
llvm-svn: 184028
|
|
|
|
| |
llvm-svn: 183960
|
|
|
|
|
|
| |
I'll fix the heuristic in a general way in a follow-up commit.
llvm-svn: 180815
|
|
|
|
|
|
|
|
|
| |
Fixes PR15838. Need to check for blocks with nothing but dbg.value.
I'm not sure how to force this situation with a unit test. I tried to
reduce the test case in PR15838 (1k lines of metadata) but gave up.
llvm-svn: 180227
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
For now, we just reschedule instructions that use the copied vregs and
let regalloc elliminate it. I would really like to eliminate the
copies on-the-fly during scheduling, but we need a complete
implementation of repairIntervalsInRange() first.
The general strategy is for the register coalescer to eliminate as
many global copies as possible and shrink live ranges to be
extended-basic-block local. The coalescer should not have to worry
about resolving local copies (e.g. it shouldn't attemp to reorder
instructions). The scheduler is a much better place to deal with local
interference. The coalescer side of this equation needs work.
llvm-svn: 180193
|
|
|
|
| |
llvm-svn: 180191
|
|
|
|
| |
llvm-svn: 179452
|
|
|
|
|
|
|
|
|
|
|
| |
The register allocator expects minimal physreg live ranges. Schedule
physreg copies accordingly. This is slightly tricky when they occur in
the middle of the scheduling region. For now, this is handled by
rescheduling the copy when its associated instruction is
scheduled. Eventually we may instead bundle them, but only if we can
preserve the bundles as parallel copies during regalloc.
llvm-svn: 179449
|
|
|
|
| |
llvm-svn: 178823
|
|
|
|
|
|
|
|
| |
For now, just save the compile time since the ConvergingScheduler
heuristics don't use this analysis. We'll probably enable it later
after compile-time investigation.
llvm-svn: 178822
|
|
|
|
|
|
|
| |
I'm getting more serious about tuning and enabling on x86/ARM. Start
by making the trace readable.
llvm-svn: 178821
|
|
|
|
| |
llvm-svn: 177620
|
|
|
|
| |
llvm-svn: 176787
|
|
|
|
|
|
|
|
|
|
| |
This verifies live intervals both before and after scheduling. It's
useful for anyone hacking on live interval update.
Note that we don't yet pass verification all the time. We don't yet
handle updating nonallocatable live intervals perfectly.
llvm-svn: 176685
|
|
|
|
|
|
| |
updateScheduledPressure method.
llvm-svn: 175362
|
|
|
|
| |
llvm-svn: 175067
|
|
|
|
| |
llvm-svn: 173775
|
|
|
|
| |
llvm-svn: 173497
|