| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
| |
llvm-svn: 161178
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Machine CSE and other optimizations can remove instructions so folding
is possible at peephole while not possible at ISel.
This patch is a rework of r160919 and was tested on clang self-host on my local
machine.
rdar://10554090 and rdar://11873276
llvm-svn: 161152
|
| |
|
|
|
|
| |
No functional change.
llvm-svn: 161149
|
| |
|
|
| |
llvm-svn: 161147
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The height on an instruction is the minimum number of cycles from the
instruction is issued to the end of the trace. Heights are computed for
all instructions in and below the trace center block.
The method for computing heights is different from the depth
computation. As we visit instructions in the trace bottom-up, heights of
used instructions are pushed upwards. This way, we avoid scanning long
use lists, looking for uses in the current trace.
At each basic block boundary, a list of live-in registers and their
minimum heights is saved in the trace block info. These live-in lists
are used when restarting depth computations on a trace that
converges with an already computed trace. They will also be used to
accurately compute the critical path length.
llvm-svn: 161138
|
| |
|
|
|
|
| |
failures in the debug testsuite and possibly PR13486.
llvm-svn: 161121
|
| |
|
|
| |
llvm-svn: 161115
|
| |
|
|
| |
llvm-svn: 161110
|
| |
|
|
|
|
|
|
| |
Use stable_sort instead of sort. Follow-up to r161062.
rdar://11980766
llvm-svn: 161075
|
| |
|
|
|
|
|
|
|
|
|
| |
Assuming infinite issue width, compute the earliest each instruction in
the trace can issue, when considering the latency of data dependencies.
The issue cycle is record as a 'depth' from the beginning of the trace.
This is half the computation required to find the length of the critical
path through the trace. Heights are next.
llvm-svn: 161074
|
| |
|
|
| |
llvm-svn: 161072
|
| |
|
|
|
|
|
|
|
|
| |
One motivating example is to sink an instruction from a basic block which has
two successors: one outside the loop, the other inside the loop. We should try
to sink the instruction outside the loop.
rdar://11980766
llvm-svn: 161062
|
| |
|
|
| |
llvm-svn: 161061
|
| |
|
|
|
|
| |
to do so.
llvm-svn: 161053
|
| |
|
|
|
|
|
|
|
| |
We are extending live ranges, so kill flags are not accurate. They
aren't needed until they are recomputed after RA anyway.
<rdar://problem/11950722>
llvm-svn: 161023
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
We branch to the successor with higher edge weight first.
Convert from
je LBB4_8 --> to outer loop
jmp LBB4_14 --> to inner loop
to
jne LBB4_14
jmp LBB4_8
PR12750
rdar: 11393714
llvm-svn: 161018
|
| |
|
|
| |
llvm-svn: 161010
|
| |
|
|
| |
llvm-svn: 161007
|
| |
|
|
| |
llvm-svn: 161004
|
| |
|
|
|
|
|
|
|
|
|
| |
This lets traces include the final iteration of a nested loop above the
center block, and the first iteration of a nested loop below the center
block.
We still don't allow traces to contain backedges, and traces are
truncated where they would leave a loop, as seen from the center block.
llvm-svn: 161003
|
| |
|
|
| |
llvm-svn: 160997
|
| |
|
|
|
|
|
|
|
|
| |
When computing a trace, all the candidates for pred/succ must have been
visited. Filter out back-edges first, though. The PO traversal ignores
them.
Thanks to Andy for spotting this in review.
llvm-svn: 160995
|
| |
|
|
|
|
|
| |
By overriding Pass::verifyAnalysis(), the pass contents will be verified
by the pass manager.
llvm-svn: 160994
|
| |
|
|
|
|
| |
loads from different x86 segments but the same address would get CSEd
llvm-svn: 160987
|
| |
|
|
|
|
|
|
|
|
|
| |
This is a cleaned up version of the isFree() function in
MachineTraceMetrics.cpp.
Transient instructions are very unlikely to produce any code in the
final output. Either because they get eliminated by RegisterCoalescing,
or because they are pseudo-instructions like labels and debug values.
llvm-svn: 160977
|
| |
|
|
|
|
|
| |
This function verifies the consistency of cached data in the
MachineTraceMetrics analysis.
llvm-svn: 160976
|
| |
|
|
|
|
|
| |
The MachineTraceMetrics analysis must be invalidated before modifying
the CFG. This will catch some of the violations of that rule.
llvm-svn: 160969
|
| |
|
|
|
|
|
|
| |
A->isPredecessor(B) is the same as B->isSuccessor(A), but it can
tolerate a B that is null or dangling. This shouldn't happen normally,
but it it useful for verification code.
llvm-svn: 160968
|
| |
|
|
| |
llvm-svn: 160927
|
| |
|
|
|
|
|
|
|
| |
Machine CSE and other optimizations can remove instructions so folding
is possible at peephole while not possible at ISel.
rdar://10554090 and rdar://11873276
llvm-svn: 160919
|
| |
|
|
|
|
| |
Jakob fixed ProcessImplicifDefs in r159149.
llvm-svn: 160910
|
| |
|
|
| |
llvm-svn: 160905
|
| |
|
|
|
|
|
| |
This makes it possible to quickly detect blocks that are outside the
trace.
llvm-svn: 160904
|
| |
|
|
|
|
|
|
|
|
| |
all tests accordingly.
Fixes PR13351.
Patch by shinichiro hamaji!
llvm-svn: 160899
|
| |
|
|
| |
llvm-svn: 160898
|
| |
|
|
|
|
|
|
| |
A value number is a PHI def if and only if it begins at a block
boundary. This can be derived from the def slot, a separate flag is not
necessary.
llvm-svn: 160893
|
| |
|
|
|
|
|
|
|
| |
This option replaces the existing live interval computation with one
based on LiveRangeCalc.cpp. The new algorithm does not depend on
LiveVariables, and it can be run at any time, before or after leaving
SSA form.
llvm-svn: 160892
|
| |
|
|
|
|
| |
Patch by Tyler Nowicki!
llvm-svn: 160888
|
| |
|
|
| |
llvm-svn: 160798
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This is still a work in progress.
Out-of-order CPUs usually execute instructions from multiple basic
blocks simultaneously, so it is necessary to look at longer traces when
estimating the performance effects of code transformations.
The MachineTraceMetrics analysis will pick a typical trace through a
given basic block and provide performance metrics for the trace. Metrics
will include:
- Instruction count through the trace.
- Issue count per functional unit.
- Critical path length, and per-instruction 'slack'.
These metrics can be used to determine the performance limiting factor
when executing the trace, and how it will be affected by a code
transformation.
Initially, this will be used by the early if-conversion pass.
llvm-svn: 160796
|
| |
|
|
| |
llvm-svn: 160791
|
| |
|
|
|
|
|
|
|
|
|
| |
It is redundant; RegisterCoalescer will do the remat if it can't eliminate
the copy. Collected instruction counts before and after this. A few extra
instructions are generated due to spilling but it is normal to see these kinds
of changes with almost any small codegen change, according to Jakob.
This also fixed rdar://11830760 where xor is expected instead of movi0.
llvm-svn: 160749
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When a live range splits into multiple connected components, we would
arbitrarily assign <undef> uses to component 0. This is wrong when the
use is tied to a def that gets assigned to a different component:
%vreg69<def> = ADD8ri %vreg68<undef>, 1
The use and def must get the same virtual register.
Fix this by assigning <undef> uses to the same component as the value
defined by the instruction, if any:
%vreg69<def> = ADD8ri %vreg69<undef>, 1
This fixes PR13402. The PR has a test case which I am not including
because it is unlikely to keep exposing this behavior in the future.
llvm-svn: 160739
|
| |
|
|
|
|
| |
Include <undef> operands and virtual registers after leaving SSA form.
llvm-svn: 160734
|
| |
|
|
|
|
| |
release builds from crashing if code uses an intrinsic with an illegal type.
llvm-svn: 160661
|
| |
|
|
| |
llvm-svn: 160621
|
| |
|
|
|
|
|
|
|
|
| |
that do not support it (X86 does not lower select_cc).
PR: 13428
Together with Michael Kuperstein <michael.m.kuperstein@intel.com>
llvm-svn: 160619
|
| |
|
|
| |
llvm-svn: 160617
|
| |
|
|
|
|
| |
release builds from crashing if code uses an intrinsic with an illegal type. For instance 256-bit AVX intrinsics without having AVX enabled.
llvm-svn: 160616
|
| |
|
|
|
|
| |
clang's -Wunused-private-field.
llvm-svn: 160583
|