- Aug 03, 2012
-
-
Jakob Stoklund Olesen authored
The VNInfo::HAS_PHI_KILL is only half supported. We precompute it in LiveIntervalAnalysis, but it isn't properly updated by live range splitting and functions like shrinkToUses(). It is only used in one place: RegisterCoalescer::removeCopyByCommutingDef(). This patch changes that function to use a new LiveIntervals::hasPHIKill() function that computes the flag for a given value number. llvm-svn: 161254
-
Jakob Stoklund Olesen authored
llvm-svn: 161242
-
Jakob Stoklund Olesen authored
This functionality was added before we started running DeadMachineInstructionElim on all targets. It serves no purpose now. llvm-svn: 161241
-
Bob Wilson authored
Fast isel doesn't currently have support for translating builtin function calls to target instructions. For embedded environments where the library functions are not available, this is a matter of correctness and not just optimization. Most of this patch is just arranging to make the TargetLibraryInfo available in fast isel. <rdar://problem/12008746> llvm-svn: 161232
-
- Aug 02, 2012
-
-
Manman Ren authored
Add more comments and use early returns to reduce nesting in isLoadFoldable. Also disable folding for V_SET0 to avoid introducing a const pool entry and a const pool load. rdar://10554090 and rdar://11873276 llvm-svn: 161207
-
Jakob Stoklund Olesen authored
Whenever both instruction depths and instruction heights are known in a block, it is possible to compute the length of the critical path as max(depth+height) over the instructions in the block. The stored live-in lists make it possible to accurately compute the length of a critical path that bypasses the current (small) block. llvm-svn: 161197
-
Jakob Stoklund Olesen authored
Don't cause regunit intervals to be computed just to verify them. Only check the already cached intervals. llvm-svn: 161183
-
Jakob Stoklund Olesen authored
LiveRangeEdit::eliminateDeadDefs() can delete a dead instruction that reads unreserved physregs. This would leave the corresponding regunit live interval dangling because we don't have shrinkToUses() for physical registers. Fix this problem by turning the instruction into a KILL instead of deleting it. This happens in a landing pad in test/CodeGen/X86/2012-05-19-CoalescerCrash.ll: %vreg27<def,dead> = COPY %EDX<kill>; GR32:%vreg27 becomes: KILL %EDX<kill> An upcoming fix to the machine verifier will catch problems like this by verifying regunit live intervals. This fixes PR13498. I am not including the test case from the PR since we already have one exposing the problem once the verifier is fixed. llvm-svn: 161182
-
Jakob Stoklund Olesen authored
llvm-svn: 161178
-
Manman Ren authored
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
-
Jakob Stoklund Olesen authored
No functional change. llvm-svn: 161149
-
Jakob Stoklund Olesen authored
llvm-svn: 161147
-
Jakob Stoklund Olesen authored
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
-
- Aug 01, 2012
-
-
Eric Christopher authored
failures in the debug testsuite and possibly PR13486. llvm-svn: 161121
-
Jakob Stoklund Olesen authored
llvm-svn: 161115
-
Elena Demikhovsky authored
llvm-svn: 161110
-
- Jul 31, 2012
-
-
Manman Ren authored
Use stable_sort instead of sort. Follow-up to r161062. rdar://11980766 llvm-svn: 161075
-
Jakob Stoklund Olesen authored
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
-
Jakob Stoklund Olesen authored
llvm-svn: 161072
-
Manman Ren authored
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
-
Micah Villmow authored
llvm-svn: 161061
-
Micah Villmow authored
llvm-svn: 161053
-
Jakob Stoklund Olesen authored
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
-
Manman Ren authored
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
-
Andrew Trick authored
llvm-svn: 161010
-
Andrew Trick authored
llvm-svn: 161007
-
Jakob Stoklund Olesen authored
llvm-svn: 161004
-
Jakob Stoklund Olesen authored
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
-
- Jul 30, 2012
-
-
Jakob Stoklund Olesen authored
llvm-svn: 160997
-
Jakob Stoklund Olesen authored
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
-
Jakob Stoklund Olesen authored
By overriding Pass::verifyAnalysis(), the pass contents will be verified by the pass manager. llvm-svn: 160994
-
Pete Cooper authored
Consider address spaces for hashing and CSEing DAG nodes. Otherwise two loads from different x86 segments but the same address would get CSEd llvm-svn: 160987
-
Jakob Stoklund Olesen authored
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
-
Jakob Stoklund Olesen authored
This function verifies the consistency of cached data in the MachineTraceMetrics analysis. llvm-svn: 160976
-
Jakob Stoklund Olesen authored
The MachineTraceMetrics analysis must be invalidated before modifying the CFG. This will catch some of the violations of that rule. llvm-svn: 160969
-
Jakob Stoklund Olesen authored
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
-
- Jul 29, 2012
-
-
Manman Ren authored
llvm-svn: 160927
-
- Jul 28, 2012
-
-
Manman Ren authored
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
-
Andrew Trick authored
Jakob fixed ProcessImplicifDefs in r159149. llvm-svn: 160910
-
Jakob Stoklund Olesen authored
llvm-svn: 160905
-