#
c3b0f50a |
| 12-Apr-2013 |
Nadav Rotem <nrotem@apple.com> |
Add a flag to align all basic blocks in the function.
When debugging performance regressions we often ask ourselves if the regression that we see is due to poor isel/sched/ra or due to some micro-ar
Add a flag to align all basic blocks in the function.
When debugging performance regressions we often ask ourselves if the regression that we see is due to poor isel/sched/ra or due to some micro-architetural problem. When comparing two code sequences one good way to rule out front-end bottlenecks (and other the issues) is to force code alignment. This pass adds a flag that forces the alignment of all of the basic blocks in the program.
llvm-svn: 179353
show more ...
|
#
6036f581 |
| 29-Mar-2013 |
Nadav Rotem <nrotem@apple.com> |
Fix a typo
llvm-svn: 178346
|
#
56b31bd9 |
| 11-Jan-2013 |
Benjamin Kramer <benny.kra@googlemail.com> |
Split TargetLowering into a CodeGen and a SelectionDAG part.
This fixes some of the cycles between libCodeGen and libSelectionDAG. It's still a complete mess but as long as the edges consist of virt
Split TargetLowering into a CodeGen and a SelectionDAG part.
This fixes some of the cycles between libCodeGen and libSelectionDAG. It's still a complete mess but as long as the edges consist of virtual call it doesn't cause breakage. BasicTTI did static calls and thus broke some build configurations.
llvm-svn: 172246
show more ...
|
#
698e84fc |
| 30-Dec-2012 |
Bill Wendling <isanbard@gmail.com> |
Remove the Function::getFnAttributes method in favor of using the AttributeSet directly.
This is in preparation for removing the use of the 'Attribute' class as a collection of attributes. That will
Remove the Function::getFnAttributes method in favor of using the AttributeSet directly.
This is in preparation for removing the use of the 'Attribute' class as a collection of attributes. That will shift to the AttributeSet class instead.
llvm-svn: 171253
show more ...
|
Revision tags: llvmorg-3.2.0 |
|
#
3d7b0b8a |
| 19-Dec-2012 |
Bill Wendling <isanbard@gmail.com> |
Rename the 'Attributes' class to 'Attribute'. It's going to represent a single attribute in the future.
llvm-svn: 170502
|
Revision tags: llvmorg-3.2.0-rc3 |
|
#
ed0881b2 |
| 03-Dec-2012 |
Chandler Carruth <chandlerc@gmail.com> |
Use the new script to sort the includes of every file under lib.
Sooooo many of these had incorrect or strange main module includes. I have manually inspected all of these, and fixed the main module
Use the new script to sort the includes of every file under lib.
Sooooo many of these had incorrect or strange main module includes. I have manually inspected all of these, and fixed the main module include to be the nearest plausible thing I could find. If you own or care about any of these source files, I encourage you to take some time and check that these edits were sensible. I can't have broken anything (I strictly added headers, and reordered them, never removed), but they may not be the headers you'd really like to identify as containing the API being implemented.
Many forward declarations and missing includes were added to a header files to allow them to parse cleanly when included first. The main module rule does in fact have its merits. =]
llvm-svn: 169131
show more ...
|
Revision tags: llvmorg-3.2.0-rc2, llvmorg-3.2.0-rc1 |
|
#
c9b22d73 |
| 09-Oct-2012 |
Bill Wendling <isanbard@gmail.com> |
Create enums for the different attributes.
We use the enums to query whether an Attributes object has that attribute. The opaque layer is responsible for knowing where that specific attribute is sto
Create enums for the different attributes.
We use the enums to query whether an Attributes object has that attribute. The opaque layer is responsible for knowing where that specific attribute is stored.
llvm-svn: 165488
show more ...
|
#
863bab68 |
| 26-Sep-2012 |
Bill Wendling <isanbard@gmail.com> |
Remove the `hasFnAttr' method from Function.
The hasFnAttr method has been replaced by querying the Attributes explicitly. No intended functionality change.
llvm-svn: 164725
|
#
291d47ef |
| 14-Sep-2012 |
Duncan Sands <baldrick@free.fr> |
Remove silly dead store. Patch by Ettl Martin.
llvm-svn: 163882
|
#
881d0a79 |
| 07-Aug-2012 |
Chandler Carruth <chandlerc@gmail.com> |
Add a much more conservative strategy for aligning branch targets. Previously, MBP essentially aligned every branch target it could. This bloats code quite a bit, especially non-looping code which ha
Add a much more conservative strategy for aligning branch targets. Previously, MBP essentially aligned every branch target it could. This bloats code quite a bit, especially non-looping code which has no real reason to prefer aligned branch targets so heavily.
As Andy said in review, it's still a bit odd to do this without a real cost model, but this at least has much more plausible heuristics.
Fixes PR13265.
llvm-svn: 161409
show more ...
|
#
2b6a0dfd |
| 31-Jul-2012 |
Manman Ren <mren@apple.com> |
Reverse order of the two branches at end of a basic block if it is profitable.
We branch to the successor with higher edge weight first. Convert from je LBB4_8 --> to outer loop jmp
Reverse order of the two branches at end of a basic block if it is profitable.
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
show more ...
|
#
9139f44d |
| 26-Jun-2012 |
Chandler Carruth <chandlerc@gmail.com> |
Update a bunch of stale comments that dated from when this folled the very first (and worst) placement algorithm. These should now more accurately reflect the reality of the pass.
llvm-svn: 159185
|
#
bde91766 |
| 02-Jun-2012 |
Benjamin Kramer <benny.kra@googlemail.com> |
Fix typos found by http://github.com/lyda/misspell-check
llvm-svn: 157885
|
Revision tags: llvmorg-3.1.0, llvmorg-3.1.0-rc3, llvmorg-3.1.0-rc2, llvmorg-3.1.0-rc1 |
|
#
8c0b41d6 |
| 16-Apr-2012 |
Chandler Carruth <chandlerc@gmail.com> |
Add a somewhat hacky heuristic to do something different from whole-loop rotation. When there is a loop backedge which is an unconditional branch, we will end up with a branch somewhere no matter wha
Add a somewhat hacky heuristic to do something different from whole-loop rotation. When there is a loop backedge which is an unconditional branch, we will end up with a branch somewhere no matter what. Try placing this backedge in a fallthrough position above the loop header as that will definitely remove at least one branch from the loop iteration, where whole loop rotation may not.
I haven't seen any benchmarks where this is important but loop-blocks.ll tests for it, and so this will be covered when I flip the default.
llvm-svn: 154812
show more ...
|
#
8c74c7b1 |
| 16-Apr-2012 |
Chandler Carruth <chandlerc@gmail.com> |
Tweak the loop rotation logic to check whether the loop is naturally laid out in a form with a fallthrough into the header and a fallthrough out of the bottom. In that case, leave the loop alone beca
Tweak the loop rotation logic to check whether the loop is naturally laid out in a form with a fallthrough into the header and a fallthrough out of the bottom. In that case, leave the loop alone because any rotation will introduce unnecessary branches. If either side looks like it will require an explicit branch, then the rotation won't add any, do it to ensure the branch occurs outside of the loop (if possible) and maximize the benefit of the fallthrough in the bottom.
llvm-svn: 154806
show more ...
|
#
ccc7e42b |
| 16-Apr-2012 |
Chandler Carruth <chandlerc@gmail.com> |
Rewrite how machine block placement handles loop rotation.
This is a complex change that resulted from a great deal of experimentation with several different benchmarks. The one which proved the mos
Rewrite how machine block placement handles loop rotation.
This is a complex change that resulted from a great deal of experimentation with several different benchmarks. The one which proved the most useful is included as a test case, but I don't know that it captures all of the relevant changes, as I didn't have specific regression tests for each, they were more the result of reasoning about what the old algorithm would possibly do wrong. I'm also failing at the moment to craft more targeted regression tests for these changes, if anyone has ideas, it would be welcome.
The first big thing broken with the old algorithm is the idea that we can take a basic block which has a loop-exiting successor and a looping successor and use the looping successor as the layout top in order to get that particular block to be the bottom of the loop after layout. This happens to work in many cases, but not in all.
The second big thing broken was that we didn't try to select the exit which fell into the nearest enclosing loop (to which we exit at all). As a consequence, even if the rotation worked perfectly, it would result in one of two bad layouts. Either the bottom of the loop would get fallthrough, skipping across a nearer enclosing loop and thereby making it discontiguous, or it would be forced to take an explicit jump over the nearest enclosing loop to earch its successor. The point of the rotation is to get fallthrough, so we need it to fallthrough to the nearest loop it can.
The fix to the first issue is to actually layout the loop from the loop header, and then rotate the loop such that the correct exiting edge can be a fallthrough edge. This is actually much easier than I anticipated because we can handle all the hard parts of finding a viable rotation before we do the layout. We just store that, and then rotate after layout is finished. No inner loops get split across the post-rotation backedge because we check for them when selecting the rotation.
That fix exposed a latent problem with our exitting block selection -- we should allow the backedge to point into the middle of some inner-loop chain as there is no real penalty to it, the whole point is that it *won't* be a fallthrough edge. This may have blocked the rotation at all in some cases, I have no idea and no test case as I've never seen it in practice, it was just noticed by inspection.
Finally, all of these fixes, and studying the loops they produce, highlighted another problem: in rotating loops like this, we sometimes fail to align the destination of these backwards jumping edges. Fix this by actually walking the backwards edges rather than relying on loopinfo.
This fixes regressions on heapsort if block placement is enabled as well as lots of other cases where the previous logic would introduce an abundance of unnecessary branches into the execution.
llvm-svn: 154783
show more ...
|
#
68062617 |
| 10-Apr-2012 |
Chandler Carruth <chandlerc@gmail.com> |
Make a somewhat subtle change in the logic of block placement. Sometimes the loop header has a non-loop predecessor which has been pre-fused into its chain due to unanalyzable branches. In this case,
Make a somewhat subtle change in the logic of block placement. Sometimes the loop header has a non-loop predecessor which has been pre-fused into its chain due to unanalyzable branches. In this case, rotating the header into the body of the loop in order to place a loop exit at the bottom of the loop is a Very Bad Idea as it makes the loop non-contiguous.
I'm working on a good test case for this, but it's a bit annoynig to craft. I should get one shortly, but I'm submitting this now so I can begin the (lengthy) performance analysis process. An initial run of LNT looks really, really good, but there is too much noise there for me to trust it much.
llvm-svn: 154395
show more ...
|
#
bed1abf9 |
| 08-Apr-2012 |
Chandler Carruth <chandlerc@gmail.com> |
Remove an over zealous assert. The assert was trying to catch places where a chain outside of the loop block-set ended up in the worklist for scheduling as part of the contiguous loop. However, asser
Remove an over zealous assert. The assert was trying to catch places where a chain outside of the loop block-set ended up in the worklist for scheduling as part of the contiguous loop. However, asserting the first block in the chain is in the loop-set isn't a valid check -- we may be forced to drag a chain into the worklist due to one block in the chain being part of the loop even though the first block is *not* in the loop. This occurs when we have been forced to form a chain early due to un-analyzable branches.
No test case here as I have no idea how to even begin reducing one, and it will be hopelessly fragile. We have to somehow end up with a loop header of an inner loop which is a successor of a basic block with an unanalyzable pair of branch instructions. Ow. Self-host triggers it so it is unlikely it will regress.
This at least gets block placement back to passing selfhost and the test suite. There are still a lot of slowdown that I don't like coming out of block placement, although there are now also a lot of speedups. =[ I'm seeing swings in both directions up to 10%. I'm going to try to find time to dig into this and see if we can turn this on for 3.1 as it does a really good job of cleaning up after some loops that degraded with the inliner changes.
llvm-svn: 154287
show more ...
|
#
49158908 |
| 08-Apr-2012 |
Chandler Carruth <chandlerc@gmail.com> |
Add a debug-only 'dump' method to the BlockChain structure to ease debugging.
llvm-svn: 154286
|
#
1fa5bcbe |
| 08-Feb-2012 |
Andrew Trick <atrick@apple.com> |
Codegen pass definition cleanup. No functionality.
Moving toward a uniform style of pass definition to allow easier target configuration. Globally declare Pass ID. Globally declare pass initializer.
Codegen pass definition cleanup. No functionality.
Moving toward a uniform style of pass definition to allow easier target configuration. Globally declare Pass ID. Globally declare pass initializer. Use INITIALIZE_PASS consistently. Add a call to the initializer from CodeGen.cpp. Remove redundant "createPass" functions and "getPassName" methods.
While cleaning up declarations, cleaned up comments (sorry for large diff).
llvm-svn: 150100
show more ...
|
#
9061616f |
| 21-Dec-2011 |
Jakub Staszak <kubastaszak@gmail.com> |
Revert patch from 147090. There is not point to make code less readable if we don't get any serious benefit there.
llvm-svn: 147101
|
#
df513345 |
| 21-Dec-2011 |
Jakub Staszak <kubastaszak@gmail.com> |
- Change a few operator[] to lookup which is cheaper. - Add some constantness.
llvm-svn: 147090
|
#
190c712f |
| 07-Dec-2011 |
Jakub Staszak <kubastaszak@gmail.com> |
Remove unneeded semicolon. Skip two looking up at BlockChain.
llvm-svn: 146053
|
#
c007ab85 |
| 07-Dec-2011 |
Jakub Staszak <jstaszak@apple.com> |
Remove unneeded type.
llvm-svn: 145995
|
#
d4d2b05e |
| 06-Dec-2011 |
Jakub Staszak <jstaszak@apple.com> |
- Remove unneeded #includes. - Remove unused types/fields. - Add some constantness.
llvm-svn: 145993
|