History log of /art/compiler/dex/bb_optimizations.h
Revision Date Author Comments
eb1404a0b59c4a981af61852c94129507efc331a 04-Sep-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Fix variable formatting and CodeLayout's multiple visits

The CodeLayout pass visits multiple times the same BasicBlock. This patch
fixes that issue to reduce its overhead.

The patch also fixes cUnit to c_unit in the bb_optimization files.

Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>

Bug: 18507840

(cherry picked from commit 75bcc3780bc40dd7c265e150aff5b891135ff6e3)

Change-Id: I4675ba0b4886c35f0093ac54e171dd87548f60c8
1fd4821f6b3ac57a44c2ce91025686da4641d197 10-Jul-2014 Vladimir Marko <vmarko@google.com> Rewrite topological sort order and improve GVN.

Rewrite the topological sort order to include a full loop
before the blocks that go after the loop. Add a new iterator
class LoopRepeatingTopologicalSortIterator that differs from
the RepeatingTopologicalSortIterator by repeating only loops
and repeating them early. It returns to the loop head if the
head needs recalculation when we reach the end of the loop.

In GVN, use the new loop-repeating topological sort iterator
and for a loop head merge only the preceding blocks' LVNs
if we're not currently recalculating this loop.

Also fix LocalValueNumbering::InPlaceIntersectMaps() which
was keeping only the last element of the intersection, avoid
some unnecessary processing during LVN merge and add some
missing braces to MIRGraph::InferTypeAndSize().

Bug: 16398693

(cherry picked from 55fff044d3a4f7196098e25bab1dad106d9b54a2)

Change-Id: Id7bcd99c8abed1b7500b9ef723313d4c5fc6f1e8
55fff044d3a4f7196098e25bab1dad106d9b54a2 10-Jul-2014 Vladimir Marko <vmarko@google.com> Rewrite topological sort order and improve GVN.

Rewrite the topological sort order to include a full loop
before the blocks that go after the loop. Add a new iterator
class LoopRepeatingTopologicalSortIterator that differs from
the RepeatingTopologicalSortIterator by repeating only loops
and repeating them early. It returns to the loop head if the
head needs recalculation when we reach the end of the loop.

In GVN, use the new loop-repeating topological sort iterator
and for a loop head merge only the preceding blocks' LVNs
if we're not currently recalculating this loop.

Also fix LocalValueNumbering::InPlaceIntersectMaps() which
was keeping only the last element of the intersection, avoid
some unnecessary processing during LVN merge and add some
missing braces to MIRGraph::InferTypeAndSize().

Bug: 16398693
Change-Id: I4e10d4acb626a5b8a28ec0de106a7b37f9cbca32
cb804742f8786826286046e9c4489ef9d7ceb7ec 10-Jul-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> ART: Rename CallInlining to SpecialMethodInliner

The CallInlining pass is used to inline just a set of pre-categorized methods.
This set of methods includes empty, instance getters, instance setters, argument
return, and constant return. Since it inlines only "special methods", it makes
sense to name it to reflect that.

Change-Id: Iea2c1820080b0c212c99e977f6b5d34ee0774868
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
95a059793c4c194f026afc74c713cc295d75d91a 30-May-2014 Vladimir Marko <vmarko@google.com> Global Value Numbering.

Implement the Global Value Numbering for optimization
purposes. Use it for the null check and range check
elimination as the LVN used to do.

The order of evaluation of basic blocks needs improving as
we currently fail to recognize some obviously identical
values in methods with more than one loop. (There are three
disabled tests that check this. This is just a missed
optimization, not a correctness issue.)

Change-Id: I0d0ce16b2495b5a3b17ad1b2b32931cd69f5a25a
622bdbe6c295b08d06dfaa8d896b9ca152aa899c 19-Jun-2014 Vladimir Marko <vmarko@google.com> Fix topological ordering and use it for optimizations.

Use the topological sort order for ClassInitCheckElimination
and NullCheckEliminationAndTypeInference.

Change-Id: I315ca7f300dd11390f48aefebfe988baf91bdcf1
e1f65bcb957a65c6d45b319d968bc53a833f2c65 09-Jun-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: PassMEDataHolder should have a data field

For passes that would like to pass data around while working, let them actually
allocate it if need be in the Start, use it during the Worker, and
potentially free it during the End.

Change-Id: I03238ef17158f7e2615d6defe5d7f15432c8a511
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
ffddfdf6fec0b9d98a692e27242eecb15af5ead2 03-Jun-2014 Tim Murray <timmurray@google.com> DO NOT MERGE

Merge ART from AOSP to lmp-preview-dev.

Change-Id: I0f578733a4b8756fd780d4a052ad69b746f687a9
2469e60e6ff08c2a0b4cd1e209246c5d91027679 07-May-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Setting up cleanup

- Moved code around to actually have the clean-up code in a PassDriver format.
This allows us to better control what is being called after an optimization
It also allows the use of a centralized pass system for both optimizations
and cleanup.

Change-Id: I9d21e9bb9ee663739722f440d82adf04f73e380c
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
a5b8fde2d2bc3167078694fad417fddfe442a6fd 23-May-2014 Vladimir Marko <vmarko@google.com> Rewrite BitVector index iterator.

The BitVector::Iterator was not iterating over the bits but
rather over indexes of the set bits. Therefore, we rename it
to IndexIterator and provide a BitVector::Indexes() to get
a container-style interface with begin() and end() for range
based for loops.

Also, simplify InsertPhiNodes where the tmp_blocks isn't
needed since the phi_nodes and input_blocks cannot lose any
blocks in subsequent iterations, so we can do the Union()
directly in those bit vectors and we need to repeat the loop
only if we have new input_blocks, rather than on phi_nodes
change. And move the temporary bit vectors to scoped arena.

Change-Id: I6cb87a2f60724eeef67c6aaa34b36ed5acde6d43
4f59668b3d51f63601ebe59dbd2b7e8a7c5bd093 01-May-2014 James C Scott <james.c.scott@intel.com> ART: Pass driver generalization

- Generalizing Pass Driver.
- Migrating ME Pass Driver to use the new generalized Pass Driver.

There will be some more changes after in the compiler code to generalize
it a bit more by separating what is being done by the optimizing passes
and post-pass cleanups.

Change-Id: I140a70e88483d7c3991b7d336bd593b2613ae194
Signed-off-by: James C Scott <james.c.scott@intel.com>
9820b7c1dc70e75ad405b9e6e63578fa9fe94e94 02-Jan-2014 Vladimir Marko <vmarko@google.com> Early inlining of simple methods.

Inlining "special" methods: empty methods, methods returning
constants or their arguments, simple getters and setters.

Bug: 8164439
Change-Id: I8c7fa9c14351fbb2470000b378a22974daaef236
bfea9c29e809e04bde4a46591fea64c5a7b922fb 17-Jan-2014 Vladimir Marko <vmarko@google.com> Class initialization check elimination.

Also, move null check elimination temporaries to the
ScopedArenaAllocator and reuse the same variables in the
class initialization check elimination.

Change-Id: Ic746f95427065506fa6016d4931e4cb8b34937af
3d73ba2ce682edfaf41f29521bd6039c6499a1c5 06-Mar-2014 Vladimir Marko <vmarko@google.com> Avoid Cache*LoweringInfo pass when there's no GET/PUT/INVOKE.

Add new data flow flags indicating instance/static field
access. Record merged flags of all insns and use them to skip
the CacheFieldLoweringInfo pass if the method uses no fields
and the CacheMethodLoweringInfo pass if it has no invokes.

Change-Id: I36a36b438ca9b0f104a7baddc0497d736495cc3c
f096aad9203d7c50b2f9cbe1c1215a50c265a059 23-Jan-2014 Vladimir Marko <vmarko@google.com> Cache method lowering info in mir graph.

This should enable easy inlining checks. It should also
improve compilation time of methods that call the same
methods over and over - it is exactly such methods that
tend to exceed our 100ms time limit.

Change-Id: If01cd18e039071a74a1444570283c153429c9cd4
be0e546730e532ef0987cd4bde2c6f5a1b14dd2a 26-Feb-2014 Vladimir Marko <vmarko@google.com> Cache field lowering info in mir_graph.

Change-Id: I9f9d76e3ae6c31e88bdf3f59820d31a625da020f
9c86a0279aaf953377aa9e2277592e68bf814989 21-Feb-2014 Ian Rogers <irogers@google.com> Revert "Annotate used fields."

This reverts commit 7f6cf56942c8469958b273ea968db253051c5b05.

Change-Id: Ic389a194c3404ecb5bb563a405bf4a0d6336ea0d
7f6cf56942c8469958b273ea968db253051c5b05 29-Jan-2014 Vladimir Marko <vmarko@google.com> Annotate used fields.

Annotate all fields used by a method early during the
compilation, check acces rights and record field offset,
volatility, etc. Use these annotations when generating code
for IGET/IPUT/SGET/SPUT instructions.

Change-Id: I4bbf5cca4fecf53c9bf9c93ac1793e2f40c16b5f
75ba13f244098f42584637b8fd3f6d74d2fc291a 28-Jan-2014 Vladimir Marko <vmarko@google.com> Reduce PassDriver overhead, clean up Pass and PassDriver.

Remove name lookup map and use vector for the pass list.
Add traversal mode kNoNodes to skip BasicBlock traversal.
Replace the warn_override parameter with a DCHECK.
Move iterators from arena to the stack. Style cleanup.

Change-Id: I4bf10e28caa65efb98ce82a4d7486d803ceca535
4e97c539408f47145526f0062c1c06df99146a73 07-Jan-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> Added pass framework

The patch adds a Middle-End pass system and normalizes the current
passes into the pass framework.

Passes have:
- A start, work, and end functions.
- A gate to determine to apply the pass.
- Can provide a CFG dump folder.

mir_dataflow.cc, mir_graph.cc, mir_optimization.cc, ssa_transformation.cc:
- Changed due to moving code into bb_optimizations.cc.
- Moved certain functions from private to public due to needed from the passes.

pass.cc, pass.h:
- Pass base class

pass_driver.cc, pass_driver.h:
- The pass driver implementation.

frontend.cc:
- Replace the function calls to the passes with the pass driver.

Change-Id: I88cd82efbf6499df9e6c7f135d7e294dd724a079
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>