Commit Graph

16377 Commits

Author SHA1 Message Date
Andrew Trick
150c97940b Revert r164061-r164067. Most of the new subtarget emitter.
I have to work out the Target/CodeGen header dependencies
before putting this back.

llvm-svn: 164072
2012-09-17 23:00:42 +00:00
Richard Smith
f96c884c89 Remove redundant semicolons to fix -pedantic-errors build break with older Clangs.
llvm-svn: 164071
2012-09-17 22:52:05 +00:00
NAKAMURA Takumi
71a6ab5ec1 llvm/Target/TargetSubtargetInfo.h: Fix case in #include, s#llvm/Codegen/#llvm/CodeGen#.
llvm-svn: 164070
2012-09-17 22:34:56 +00:00
Andrew Trick
cc6a5dbc2b Don't use NULL as a fake keyword
llvm-svn: 164067
2012-09-17 22:26:34 +00:00
Andrew Trick
9400ee3c79 InitMCProcessor
llvm-svn: 164066
2012-09-17 22:19:12 +00:00
Andrew Trick
3d3f796f3f TargetSchedModel API. Implement latency lookup, disabled.
llvm-svn: 164065
2012-09-17 22:19:08 +00:00
Andrew Trick
7403ff5282 TableGen subtarget emitter. Generate resolveSchedClass generated hook for resolving instruction variants.
llvm-svn: 164062
2012-09-17 22:18:58 +00:00
Andrew Trick
8a499d1f62 TableGen subtarget emitter. Initialize MCSubtargetInfo with the new machine model.
llvm-svn: 164061
2012-09-17 22:18:55 +00:00
Tom Stellard
a909d69703 Add a MachinePostDominator pass
This is used in the AMDIL and R600 backends.

llvm-svn: 164029
2012-09-17 14:08:37 +00:00
Sid Manning
18c80378fb Add Michael Spencer's iterator class for stepping through relocations. Add method that, given a symbol index, will return the symbol's data.
llvm-svn: 164026
2012-09-17 12:27:39 +00:00
Craig Topper
24f46609c1 Mark unimplemented copy constructors and copy assignment operators as LLVM_DELETED_FUNCTION.
llvm-svn: 164017
2012-09-17 07:16:40 +00:00
Craig Topper
ef3c8f8807 Mark unimplemented copy constructors and copy assignment operators as LLVM_DELETED_FUNCTION.
llvm-svn: 164016
2012-09-17 06:59:23 +00:00
Craig Topper
1d55f3f906 Mark unimplemented copy constructors and copy assignment operators as LLVM_DELETED_FUNCTION.
llvm-svn: 164015
2012-09-17 06:43:55 +00:00
Craig Topper
f2e8b27fbc Mark unimplemented copy constructors and copy assignment operators as LLVM_DELETED_FUNCTION.
llvm-svn: 164014
2012-09-17 06:31:17 +00:00
Craig Topper
7ace4c590b Remove a couple unused fields. Not detected by Wunused-private-field because of unimplemented copy constructor and copy assignment operator that make the class look incomplete. Upcoming patch will mark them deleted.
llvm-svn: 164013
2012-09-17 06:05:39 +00:00
Craig Topper
c956a94300 Add include of Compiler.h to fix build bot failures.
llvm-svn: 164009
2012-09-16 21:56:23 +00:00
Craig Topper
a654200309 Add includes of Compiler.h to fix build bot failures.
llvm-svn: 164008
2012-09-16 21:50:09 +00:00
Craig Topper
13109b709d Use LLVM_DELETED_FUNCTION for copy constructors and copy assignment operators that aren't implemented.
llvm-svn: 164007
2012-09-16 21:43:09 +00:00
Craig Topper
d34712230a Use LLVM_DELETED_FUNCTION for copy constructors and copy assignment operators that aren't implemented.
llvm-svn: 164006
2012-09-16 21:37:56 +00:00
Craig Topper
73f5e77c6f Add LLVM_OVERRIDE and LLVM_FINAL C++11 compatibility macros.
llvm-svn: 164005
2012-09-16 20:53:30 +00:00
Craig Topper
6a41128e52 Add explicit virtual keywords for methods that override base class.
llvm-svn: 163996
2012-09-16 07:39:55 +00:00
Andrew Trick
e7a0178af4 Guard fields by NDEBUG until they get used in the release build.
llvm-svn: 163993
2012-09-16 05:55:04 +00:00
Craig Topper
a71d0f57b9 Tidy up formatting of some elses on a separate line from preceding bracing. No functional change.
llvm-svn: 163992
2012-09-16 03:00:03 +00:00
Jakob Stoklund Olesen
d086379b21 Fix problem when using LiveRangeQuery with block entries.
A value that is live in to a basic block should be returned by valueIn()
in LiveRangeQuery(getMBBStartIdx(MBB)), unless it is a PHI-def which
should be returned by valueDefined() instead.

Current code isn't using this functionality. Future code will.

llvm-svn: 163990
2012-09-16 02:15:33 +00:00
Craig Topper
239ccf7e3a Tidy up trailing whitespace.
llvm-svn: 163988
2012-09-16 01:20:35 +00:00
Craig Topper
51933d960f Remove unneeded header.
llvm-svn: 163987
2012-09-16 01:18:51 +00:00
Dmitri Gribenko
dd5d6c0da7 Fix Doxygen issues: wrap code examples in \code and use \p to refer to
parameters.

llvm-svn: 163984
2012-09-15 20:22:05 +00:00
Craig Topper
eabf91db27 Fix a couple include directives that used angle brackets for llvm files.
llvm-svn: 163978
2012-09-15 18:41:37 +00:00
Jakob Stoklund Olesen
e9bd24a10e Make LiveRangeQuery work for PHIDefs as well.
If a PHI value happens to be live out from the layout predecessor of its
def block, the def slot index will be in the middle of the segment:

%vreg11 = [192r,240B:0)[352r,416B:2)[416B,496r:1)  0@192r 1@480B-phi %2@352r

A LiveRangeQuery for 480 should return NULL from valueIn() since the
PHI value is defined at the block entry, not live in to the block.

No test case, future code depends on this functionality.

llvm-svn: 163971
2012-09-15 16:29:49 +00:00
Craig Topper
dfe55636a3 Use LLVM_DELETED_FUNCTION in place of 'DO NOT IMPLEMENT' comments.
llvm-svn: 163969
2012-09-15 16:22:27 +00:00
Chandler Carruth
93b1521a98 Port the SSAUpdater-based promotion logic from the old SROA pass to the
new one, and add support for running the new pass in that mode and in
that slot of the pass manager. With this the new pass can completely
replace the old one within the pipeline.

The strategy for enabling or disabling the SSAUpdater logic is to do it
by making the requirement of the domtree analysis optional. By default,
it is required and we get the standard mem2reg approach. This is usually
the desired strategy when run in stand-alone situations. Within the
CGSCC pass manager, we disable requiring of the domtree analysis and
consequentially trigger fallback to the SSAUpdater promotion.

In theory this would allow the pass to re-use a domtree if one happened
to be available even when run in a mode that doesn't require it. In
practice, it lets us have a single pass rather than two which was
simpler for me to wrap my head around.

There is a hidden flag to force the use of the SSAUpdater code path for
the purpose of testing. The primary testing strategy is just to run the
existing tests through that path. One notable difference is that it has
custom code to handle lifetime markers, and one of the tests has been
enhanced to exercise that code.

This has survived a bootstrap and the test suite without serious
correctness issues, however my run of the test suite produced *very*
alarming performance numbers. I don't entirely understand or trust them
though, so more investigation is on-going.

To aid my understanding of the performance impact of the new SROA now
that it runs throughout the optimization pipeline, I'm enabling it by
default in this commit, and will disable it again once the LNT bots have
picked up one iteration with it. I want to get those bots (which are
much more stable) to evaluate the impact of the change before I jump to
any conclusions.

NOTE: Several Clang tests will fail because they run -O3 and check the
result's order of output. They'll go back to passing once I disable it
again.

llvm-svn: 163965
2012-09-15 11:43:14 +00:00
Daniel Dunbar
aec33914ca formatted_raw_ostream: Fix a serious bug in tell().
- The current_pos function is supposed to return all the written bytes, not the
   current position of the underlying stream.
 - This caused tell() to be broken whenever the underlying stream had buffered
   content.

llvm-svn: 163948
2012-09-14 23:15:56 +00:00
Bill Wendling
02fcf0f1d8 Some small reorganization to get read for Attributes overhaul.
llvm-svn: 163947
2012-09-14 23:05:52 +00:00
David Blaikie
c05c0c5f06 Fix up erroneous alignas usage while making this portable to GCC 4.7
Review by Chandler Carruth.

llvm-svn: 163944
2012-09-14 22:26:11 +00:00
Evan Cheng
ef1d563477 Stylistic and 80-col fixes
llvm-svn: 163940
2012-09-14 21:25:34 +00:00
Andrew Trick
afc4e472a1 comment typo
llvm-svn: 163935
2012-09-14 20:27:25 +00:00
Andrew Trick
344fdddf04 TargetSchedModel interface. To be implemented...
llvm-svn: 163934
2012-09-14 20:26:46 +00:00
Andrew Trick
d5d5992107 Define MC data tables for the new scheduling machine model.
llvm-svn: 163933
2012-09-14 20:26:41 +00:00
Andrew Trick
9b1f6bcc11 whitespace
llvm-svn: 163932
2012-09-14 20:26:39 +00:00
Andrew Trick
e03e293d6d misched: add a hook for custom DAG postprocessing.
llvm-svn: 163915
2012-09-14 17:22:42 +00:00
Micah Villmow
44d475f2a3 Add in comments that explain what the indexing and the size of the arrays is about.
llvm-svn: 163904
2012-09-14 15:36:50 +00:00
Dmitri Gribenko
93c7ec80b7 Fix Doxygen issues:
* wrap code blocks in \code ... \endcode;
* refer to parameter names in paragraphs correctly (\arg is not what most
  people want -- it starts a new paragraph);
* use \param instead of \arg to document parameters in order to be consistent
  with the rest of the codebase.

llvm-svn: 163902
2012-09-14 14:57:36 +00:00
Chandler Carruth
3be91908a4 Introduce a new SROA implementation.
This is essentially a ground up re-think of the SROA pass in LLVM. It
was initially inspired by a few problems with the existing pass:
- It is subject to the bane of my existence in optimizations: arbitrary
  thresholds.
- It is overly conservative about which constructs can be split and
  promoted.
- The vector value replacement aspect is separated from the splitting
  logic, missing many opportunities where splitting and vector value
  formation can work together.
- The splitting is entirely based around the underlying type of the
  alloca, despite this type often having little to do with the reality
  of how that memory is used. This is especially prevelant with unions
  and base classes where we tail-pack derived members.
- When splitting fails (often due to the thresholds), the vector value
  replacement (again because it is separate) can kick in for
  preposterous cases where we simply should have split the value. This
  results in forming i1024 and i2048 integer "bit vectors" that
  tremendously slow down subsequnet IR optimizations (due to large
  APInts) and impede the backend's lowering.

The new design takes an approach that fundamentally is not susceptible
to many of these problems. It is the result of a discusison between
myself and Duncan Sands over IRC about how to premptively avoid these
types of problems and how to do SROA in a more principled way. Since
then, it has evolved and grown, but this remains an important aspect: it
fixes real world problems with the SROA process today.

First, the transform of SROA actually has little to do with replacement.
It has more to do with splitting. The goal is to take an aggregate
alloca and form a composition of scalar allocas which can replace it and
will be most suitable to the eventual replacement by scalar SSA values.
The actual replacement is performed by mem2reg (and in the future
SSAUpdater).

The splitting is divided into four phases. The first phase is an
analysis of the uses of the alloca. This phase recursively walks uses,
building up a dense datastructure representing the ranges of the
alloca's memory actually used and checking for uses which inhibit any
aspects of the transform such as the escape of a pointer.

Once we have a mapping of the ranges of the alloca used by individual
operations, we compute a partitioning of the used ranges. Some uses are
inherently splittable (such as memcpy and memset), while scalar uses are
not splittable. The goal is to build a partitioning that has the minimum
number of splits while placing each unsplittable use in its own
partition. Overlapping unsplittable uses belong to the same partition.
This is the target split of the aggregate alloca, and it maximizes the
number of scalar accesses which become accesses to their own alloca and
candidates for promotion.

Third, we re-walk the uses of the alloca and assign each specific memory
access to all the partitions touched so that we have dense use-lists for
each partition.

Finally, we build a new, smaller alloca for each partition and rewrite
each use of that partition to use the new alloca. During this phase the
pass will also work very hard to transform uses of an alloca into a form
suitable for promotion, including forming vector operations, speculating
loads throguh PHI nodes and selects, etc.

After splitting is complete, each newly refined alloca that is
a candidate for promotion to a scalar SSA value is run through mem2reg.

There are lots of reasonably detailed comments in the source code about
the design and algorithms, and I'm going to be trying to improve them in
subsequent commits to ensure this is well documented, as the new pass is
in many ways more complex than the old one.

Some of this is still a WIP, but the current state is reasonbly stable.
It has passed bootstrap, the nightly test suite, and Duncan has run it
successfully through the ACATS and DragonEgg test suites. That said, it
remains behind a default-off flag until the last few pieces are in
place, and full testing can be done.

Specific areas I'm looking at next:
- Improved comments and some code cleanup from reviews.
- SSAUpdater and enabling this pass inside the CGSCC pass manager.
- Some datastructure tuning and compile-time measurements.
- More aggressive FCA splitting and vector formation.

Many thanks to Duncan Sands for the thorough final review, as well as
Benjamin Kramer for lots of review during the process of writing this
pass, and Daniel Berlin for reviewing the data structures and algorithms
and general theory of the pass. Also, several other people on IRC, over
lunch tables, etc for lots of feedback and advice.

llvm-svn: 163883
2012-09-14 09:22:59 +00:00
Andrew Trick
064f380b12 misched: Generic tablegen classes for the new machine model.
This is mostly documentation for the new machine model. It is designed
to be flexible, easy to incrementally refine for a subtarget, and
provide all the information that MachineScheduler will need.

If all goes well, I will follow up with an example of the new model in
use for ARM.

llvm-svn: 163877
2012-09-14 06:18:55 +00:00
Andrew Trick
47406c907f comment
llvm-svn: 163876
2012-09-14 06:18:52 +00:00
Andrew Trick
1db523eb5e comment
llvm-svn: 163875
2012-09-14 06:18:50 +00:00
Jim Grosbach
9f25ce7cba MachO: Correctly mark symbol-difference variables as N_ABS.
.set a, b - c + CONSTANT
d = b - c + CONSTANT

Both 'a' and 'd' should be marked as absolute symbols (N_ABS).

rdar://12219394

llvm-svn: 163853
2012-09-13 23:11:25 +00:00
Jim Grosbach
1719446f43 Better const handling for RuntimeDyld and MCJIT.
mapSectionAddress() wasn't consistent.

llvm-svn: 163843
2012-09-13 21:50:06 +00:00
Richard Smith
b3aa4796fb Fix some code which is invalid in C++11: an expression of enumeration type
can't be used as a non-type template argument of type bool.

llvm-svn: 163840
2012-09-13 21:18:18 +00:00
Dmitri Gribenko
f94c313303 Fix documentation: parameter being documented was removed in r98220.
llvm-svn: 163834
2012-09-13 20:28:31 +00:00