c6ea7d00ad069a2736f603daa3d8eaa9a1f8ea11 |
|
02-Feb-2017 |
Andreas Gampe <agampe@google.com> |
ART: Clean up art_method.h Clean up the header. Fix up other headers including the -inl file, in an effort to prune the include graph. Fix broken transitive includes by making includes explicit. Introduce new -inl files for method handles and reference visiting. Test: source build/envsetup.sh && lunch aosp_angler-userdebug && mmma art Test: source build/envsetup.sh && lunch aosp_mips64-userdebug && mmma art Change-Id: I8f60f1160c2a702fdf3598149dae38f6fa6bc851
|
dd0fc0481cdc4e04abb7b7300e76edbd2f07f011 |
|
28-Mar-2017 |
Nicolas Geoffray <ngeoffray@google.com> |
Make data dependency around HDeoptimize correct. We use HDeoptimize in a few places, but when it comes to data dependency we either: - don't have any (BCE, CHA), in which case we should make sure no code that the deoptimzation guards moves before the HDeoptimize - have one on the receiver (inline cache), in which case we can update the dominated users with the HDeoptimize to get the data dependency correct. bug:35661819 bug:36371709 test: 644-checker-deopt Change-Id: I30b750f97b656dede9e10e7e43ac02c8604d7b7a (cherry picked from commit 6f8e2c9913b24f746a154dda700f609cee3095f9)
|
6f8e2c9913b24f746a154dda700f609cee3095f9 |
|
23-Mar-2017 |
Nicolas Geoffray <ngeoffray@google.com> |
Make data dependency around HDeoptimize correct. We use HDeoptimize in a few places, but when it comes to data dependency we either: - don't have any (BCE, CHA), in which case we should make sure no code that the deoptimzation guards moves before the HDeoptimize - have one on the receiver (inline cache), in which case we can update the dominated users with the HDeoptimize to get the data dependency correct. bug:35661819 bug:36371709 test: 644-checker-deopt Change-Id: I4820c6710b06939e7f5a59606971693e995fb958
|
c4aa82c5b0aa921c51eaf6f6bbaff36501ea2cee |
|
06-Mar-2017 |
Nicolas Geoffray <ngeoffray@google.com> |
Invoke typed arraycopy for primitive arrays. Apps will always call the Object version of arraycopy. When we can infer the types of the passed arrays, replace the method being called to be the typed System.arraycopy one. 10% improvement on ExoPlayerBench. Test: 641-checker-arraycopy bug: 7103825 Change-Id: I872d7a6e163a4614510ef04ae582eb90ec48b5fa
|
e761bccf9f0d884cc4d4ec104568cef968296492 |
|
19-Jan-2017 |
Nicolas Geoffray <ngeoffray@google.com> |
Revert "Revert "Load the array class in the compiler for allocations."" This reverts commit fee255039e30c1c3dfc70c426c3d176221c3cdf9. Change-Id: I02b45f9a659d872feeb35df40b42c1be9878413a
|
fee255039e30c1c3dfc70c426c3d176221c3cdf9 |
|
19-Jan-2017 |
Hiroshi Yamauchi <yamauchi@google.com> |
Revert "Load the array class in the compiler for allocations." libcore test fails. This reverts commit cc99df230feb46ba717252f002d0cc2da6828421. Change-Id: I5bac595acd2b240886062e8c1f11f9095ff6a9ed
|
cc99df230feb46ba717252f002d0cc2da6828421 |
|
18-Jan-2017 |
Nicolas Geoffray <ngeoffray@google.com> |
Load the array class in the compiler for allocations. Removing one other dependency for needing to pass the current method, and having dex_cache_resolved_types_ in ArtMethod. oat file increase: - x64: 0.25% - arm32: 0.30% - x86: 0.28% test: test-art-host, test-art-target Change-Id: Ibca4fa00d3e31954db2ccb1f65a584b8c67cb230
|
c52b26d4fb5b1ca91f34ce4b535b764853e538f6 |
|
19-Dec-2016 |
Nicolas Geoffray <ngeoffray@google.com> |
Recognize getClass() in RTP. Also always keep around the resolved field in related HInstructions to avoid resolving it again and again. Test: test-art-host, 631-checker-get-class Change-Id: I3bc6be11f3eb175c635e746006f39865947e0669
|
431121fb0e1fab93a550e71e1da22d3bf056bd95 |
|
09-Jan-2017 |
Nicolas Geoffray <ngeoffray@google.com> |
The HBoundsCheck should be the index input of String.charAt. Otherwise, the charAt call may be licmed but the bounds check stay in the loop. bug: 33909430 bug: 28330359 Test: 632-checker-char-at-bounds Change-Id: I3cb749785c26ff8a016a7103899e9b19a24d5022
|
ab2270f8f7ecd93c7ba353dd4e300669de3e7aee |
|
15-Dec-2016 |
Aart Bik <ajcbik@google.com> |
Fixed signal 11 bug by not testing resolved method first. Test: test-art-host Bug: 33656359 Change-Id: Idb1afccf811a2fbf7500fc1d953e118981ad36d4
|
9186ced255f2e7402646b5b286deebb540640734 |
|
12-Dec-2016 |
Andreas Gampe <agampe@google.com> |
ART: Clean up utils.h Remove functionality provided by libbase. Move some single-use functions to their respective users. Test: m test-art-host Change-Id: I75594035fa975200d638cc29bb9f31bc6e6cb29f
|
71bf7b43380eb445973f32a7f789d9670f8cc97d |
|
16-Nov-2016 |
Aart Bik <ajcbik@google.com> |
Optimizations around escape analysis. With tests. Details: (1) added new intrinsics (2) implemented optimizations more !can be null information more null check removals replace return-this uses with incoming parameter remove dead StringBuffer/Builder calls (with escape analysis) (3) Fixed exposed bug in CanBeMoved() Performance gain: This improves CafeineString by about 360% (removes null check from first loop, eliminates second loop completely) Test: test-art-host Change-Id: Iaf16a1b9cab6a7386f43d71c6b51dd59600e81c1
|
ff7d89c0364f6ebd0f0798eb18ef8bd62917de6a |
|
07-Nov-2016 |
Aart Bik <ajcbik@google.com> |
Allow read side effects for removing dead instructions. Rationale: Instructions that only have the harmless read side effect may be removed when dead as well, we were too strict previously. As proof of concept, this cl also provides more accurate information on a few string related intrinsics. This removes the dead indexOf from CaffeineString (17% performance improvement, big bottleneck of the StringBuffer's toString() still remains in loop). Test: test-art-host Change-Id: Id835a8e287e13e1f09be6b46278a039b8865802e
|
2767f4ba2df934fea4c50a016e2955c2cf3f6b19 |
|
29-Oct-2016 |
Aart Bik <ajcbik@google.com> |
New instruction simplifications. Extra dce pass. Allow more per block repeats. Rationale: We were missing some obvious simplifications, which left performance at the table for e.g. CaffeineLogic compiled with dx (4200us->2700us). The constant for allowing a repeat on a BB seemed very low, at the very least it should depend on the BB size. Test: test-art-host Change-Id: Ic234566e117593e12c936d556222e4cd4f928105
|
2c45bc9137c29f886e69923535aff31a74d90829 |
|
25-Oct-2016 |
Vladimir Marko <vmarko@google.com> |
Remove H[Reverse]PostOrderIterator and HInsertionOrderIterator. Use range-based loops instead, introducing helper functions ReverseRange() for iteration in reverse order in containers. When the contents of the underlying container change inside the loop, use an index-based loop that better exposes the container data modifications, compared to the old iterator interface that's hiding it which may lead to subtle bugs. Test: m test-art-host Change-Id: I2a4e6c508b854c37a697fc4b1e8423a8c92c5ea0
|
0795f23920ee9aabf28e45c63cd592dcccf00216 |
|
28-Sep-2016 |
Mathieu Chartier <mathieuc@google.com> |
Clean up ScopedThreadStateChange to use ObjPtr Also fixed inclusion of -inl.h files in .h files by adding scoped_object_access-inl.h and scoped_fast_natvie_object_access-inl.h Changed AddLocalReference / Decode to use ObjPtr. Changed libartbenchmark to be debug to avoid linkage errors. Bug: 31113334 Test: test-art-host Change-Id: I4d2e160483a29d21e1e0e440585ed328b9811483
|
5e4e11e171f90d9a3ea178fc8e72aac909de55d5 |
|
22-Sep-2016 |
Nicolas Geoffray <ngeoffray@google.com> |
Clean-up sharpening and compiler driver. Remove dependency on compiler driver for sharpening and dex2dex (the methods called on the compiler driver were doing unnecessary work), and remove the now unused methods in compiler driver. Also remove test that is now invalid, as sharpening always succeeds. test: m test-art-host m test-art-target Change-Id: I54e91c6839bd5b0b86182f2f43ba5d2c112ef908
|
9837caff9cbfb61e3dabc6fbecb398d4d659c017 |
|
01-Aug-2016 |
Sebastien Hertz <shertz@google.com> |
Update art tests Jack generates different code compared to the previous release so some tests need to be updated. For instance, Jack transform '!cond' into 'cond xor 1'. The test 463-checker-boolean-simplifier still tests the if/else pattern using smali. (cherry picked from commit e4d28c502486afe58a0e156b8fefb621a622cec2) Bug: 29493697 Test: lunch aosp_bullhead-userdebug && make -j32 Test: make -j32 test-art-host && make -j32 test-art-target Test: art/tools/run-jdwp-tests.sh --mode=host Change-Id: Ief8ac3e9a4bcaa35c99e57161961d630333d3b3c
|
d3278bd288aaecd525f931a54f5f2a392f627fd3 |
|
12-Jul-2016 |
Maxim Kazantsev <maxim.kazantsev@intel.com> |
Two more patterns for instruction simplifier This patch allows the instruction simplifier to cover two more cases: x = a + b and x = a - b y = x - b y = x + b In both cases y can be replaced with a, if the types of arguments are integral. Change-Id: I4735737f471e31057f1df76ddace5d4d1c79cde6 Test: New tests in 458-checker-instruction-simplification. Signed-off-by: Max Kazantsev <maxim.kazantsev@intel.com>
|
e14dc86d4e84d52426510d0fafbac3d7e04f960c |
|
13-May-2016 |
Anton Kirilov <anton.kirilov@linaro.org> |
Simplification for associative and commutative operations on constants The purpose of this change is to enable the instruction simplifier to recognize patterns such as OP y, x, const1 OP z, y, const2 where OP is both an associative and a commutative operation on integral types, and replace them with OP z, x, const3 Since subtraction on integral types is equivalent to addition with a negated operand, it receives a similar treatment, even though it is not commutative. Change-Id: I278cac39bd39bc843d250a976931cb000876ea88
|
50518449afe8fa7eb741f42c904fb4baf6c34da2 |
|
27-Jun-2016 |
Alexandre Rames <alexandre.rames@linaro.org> |
Optimize away useless masking operations on shift amounts. Change-Id: I90d69757cc45312eda3d57cc2d32bfb4e47963f5
|
87f3fcbd0db352157fc59148e94647ef21b73bce |
|
28-Apr-2016 |
Vladimir Marko <vmarko@google.com> |
Replace String.charAt() with HIR. Replace String.charAt() with HArrayLength, HBoundsCheck and HArrayGet. This allows GVN on the HArrayLength and BCE on the HBoundsCheck as well as using the infrastructure for HArrayGet, i.e. better handling of constant indexes than the old intrinsic and using the HArm64IntermediateAddress. Bug: 28330359 Change-Id: I32bf1da7eeafe82537a60416abf6ac412baa80dc
|
372f10e5b0b34e2bb6e2b79aeba6c441e14afd1f |
|
17-May-2016 |
Vladimir Marko <vmarko@google.com> |
Refactor handling of input records. Introduce HInstruction::GetInputRecords(), a new virtual function that returns an ArrayRef<> to all input records. Implement all other functions dealing with input records as wrappers around GetInputRecords(). Rewrite functions that previously used multiple virtual calls to deal with input records, especially in loops, to prefetch the ArrayRef<> only once for each instruction. Besides avoiding all the extra calls, this also allows the compiler (clang++) to perform additional optimizations. This speeds up the Nexus 5 boot image compilation by ~0.5s (4% of "Compile Dex File", 2% of dex2oat time) on AOSP ToT. Change-Id: Id8ebe0fb9405e38d918972a11bd724146e4ca578
|
c5809c3c31814e80a19c71adca306378281f2ab4 |
|
25-May-2016 |
Alexandre Rames <alexandre.rames@linaro.org> |
Add missing calls to `RecordSimplification()`. Note that not all transformations in the instruction simplifier call this helper. It is used to track a loosely defined category of transformations for which we may benefit from re-running the simplifier. Change-Id: I14dd841a30c526065cff337627c9156abe3d7c0a
|
dce016eab87302f02b0bd903dd2cd86ae512df2d |
|
28-Apr-2016 |
Vladimir Marko <vmarko@google.com> |
Intrinsify String.length() and String.isEmpty() as HIR. Use HArrayLength for String.length() in anticipation of changing the String.charAt() to HBoundsCheck+HArrayGet to allow the existing BCE to seamlessly work for strings. Use HArrayLength+HEqual for String.isEmpty(). We previously relied on inlining but we now want to apply the new intrinsics even when we do not inline, i.e. when compiling debuggable (as is currently the case for boot image) or when we hit inlining limits, i.e. depth, size, or the number of accumulated dex registers. Bug: 28330359 Change-Id: Iab9d2f6d2967bdd930a72eb461f27efe8f37c103
|
d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6ede |
|
29-Mar-2016 |
Vladimir Marko <vmarko@google.com> |
Use iterators "before" the use node in HUserRecord<>. Create a new template class IntrusiveForwardList<> that mimicks std::forward_list<> except that all allocations are handled externally. This is essentially the same as boost::intrusive::slist<> but since we're not using Boost we have to reinvent the wheel. Use the new container to replace the HUseList and use the iterators to "before" use nodes in HUserRecord<> to avoid the extra pointer to the previous node which was used exclusively for removing nodes from the list. This reduces the size of the HUseListNode by 25%, 32B to 24B in 64-bit compiler, 16B to 12B in 32-bit compiler. This translates directly to overall memory savings for the 64-bit compiler but due to rounding up of the arena allocations to 8B, we do not get any improvement in the 32-bit compiler. Compiling the Nexus 5 boot image with the 64-bit dex2oat on host this CL reduces the memory used for compiling the most hungry method, BatteryStats.dumpLocked(), by ~3.3MiB: Before: MEM: used: 47829200, allocated: 48769120, lost: 939920 Number of arenas allocated: 345, Number of allocations: 815492, avg size: 58 ... UseListNode 13744640 ... After: MEM: used: 44393040, allocated: 45361248, lost: 968208 Number of arenas allocated: 319, Number of allocations: 815492, avg size: 54 ... UseListNode 10308480 ... Note that while we do not ship the 64-bit dex2oat to the device, the JIT compilation for 64-bit processes is using the 64-bit libart-compiler. Bug: 28173563 Bug: 27856014 (cherry picked from commit 46817b876ab00d6b78905b80ed12b4344c522b6c) Change-Id: Ifb2d7b357064b003244e92c0d601d81a05e56a7b
|
46817b876ab00d6b78905b80ed12b4344c522b6c |
|
29-Mar-2016 |
Vladimir Marko <vmarko@google.com> |
Use iterators "before" the use node in HUserRecord<>. Create a new template class IntrusiveForwardList<> that mimicks std::forward_list<> except that all allocations are handled externally. This is essentially the same as boost::intrusive::slist<> but since we're not using Boost we have to reinvent the wheel. Use the new container to replace the HUseList and use the iterators to "before" use nodes in HUserRecord<> to avoid the extra pointer to the previous node which was used exclusively for removing nodes from the list. This reduces the size of the HUseListNode by 25%, 32B to 24B in 64-bit compiler, 16B to 12B in 32-bit compiler. This translates directly to overall memory savings for the 64-bit compiler but due to rounding up of the arena allocations to 8B, we do not get any improvement in the 32-bit compiler. Compiling the Nexus 5 boot image with the 64-bit dex2oat on host this CL reduces the memory used for compiling the most hungry method, BatteryStats.dumpLocked(), by ~3.3MiB: Before: MEM: used: 47829200, allocated: 48769120, lost: 939920 Number of arenas allocated: 345, Number of allocations: 815492, avg size: 58 ... UseListNode 13744640 ... After: MEM: used: 44393040, allocated: 45361248, lost: 968208 Number of arenas allocated: 319, Number of allocations: 815492, avg size: 54 ... UseListNode 10308480 ... Note that while we do not ship the 64-bit dex2oat to the device, the JIT compilation for 64-bit processes is using the 64-bit libart-compiler. Bug: 28173563 Change-Id: I985eabd4816f845372d8aaa825a1489cf9569208
|
f355c3ff08710ac2eba3aac2aacc5e65caa06b4c |
|
30-Mar-2016 |
Roland Levillain <rpl@google.com> |
Fix Boolean to integral types conversions. Bug: 27616343 Change-Id: I050f92045bca1b8b5d6da53547cc617f17be84b1
|
d96a246e5b103bfc167acaa6315bd8abca9de493 |
|
23-Mar-2016 |
Vladimir Marko <vmarko@google.com> |
Optimizing: Do not insert suspend checks on back-edges. Rely on HGraph::SimplifyLoop() to insert suspend checks. CodeGenerator's CheckLoopEntriesCanBeUsedForOsr() checks the dex pcs of suspend checks against branch targets to verify that we always have an appropriate point for OSR transition. However, the HSuspendChecks that were added by HGraphBuilder to support the recently removed "baseline" interfered with this in a specific case, namely an infinite loop where the back-branch jumps to a nop. In that case, the HSuspendCheck added by HGraphBuilder had a dex pc different from the block and the branch target but its presence would stop the HGraph::SimplifyLoop() from adding a new HSuspendCheck with the correct dex pc. Bug: 27623547 Change-Id: I83566a260210bc05aea0c44509a39bb490aa7003
|
5b5b9319ff970979ed47d41a41283e4faeffb602 |
|
22-Mar-2016 |
Roland Levillain <rpl@google.com> |
Fix and improve shift and rotate operations. - Define maximum int and long shift & rotate distances as int32_t constants, as shift & rotate distances are 32-bit integer values. - Consider the (long, long) inputs case as invalid for static evaluation of shift & rotate rotations. - Add more checks in shift & rotate operations constructors as well as in art::GraphChecker. Change-Id: I754b326c3a341c9cc567d1720b327dad6fcbf9d6
|
937e6cd515bbe7ff2f255c8fcd40bf1a575a9a16 |
|
22-Mar-2016 |
Roland Levillain <rpl@google.com> |
Tighten art::HNeg type constraints on its input. Ensure art::HNeg is only passed a type having the kind of its input. For a boolean, byte, short, or char input, it means HNeg's type should be int. Bug: 27684275 Change-Id: Ic8442c62090a8ab65590754874a14a0deb7acd8d
|
1a65388f1d86bb232c2e44fecb44cebe13105d2e |
|
18-Mar-2016 |
Roland Levillain <rpl@google.com> |
Clean up art::HConstant predicates. - Make the difference between arithmetic zero and zero-bit pattern non ambiguous. - Introduce Boolean predicates in art::HIntConstant for when they are used as Booleans. - Introduce aritmetic positive and negative zero predicates for floating-point constants. Bug: 27639313 Change-Id: Ia04ecc6f6aa7450136028c5362ed429760c883bd
|
22c4922c6b31e154a6814c4abe9015d9ba156911 |
|
18-Mar-2016 |
Roland Levillain <rpl@google.com> |
Ensure art::HRor support boolean, byte, short and char inputs. Also extend tests covering the IntegerRotateLeft, LongRotateLeft, IntegerRotateRight and LongRotateRight intrinsics and their translation into an art::HRor instruction. Bug: 27682579 Change-Id: I89f6ea6a7315659a172482bf09875cfb7e7422a1
|
a5c4a4060edd03eda017abebc85f24cffb083ba7 |
|
15-Mar-2016 |
Roland Levillain <rpl@google.com> |
Make art::HCompare support boolean, byte, short and char inputs. Also extend tests covering the IntegerSignum, LongSignum, IntegerCompare and LongCompare intrinsics and their translation into an art::HCompare instruction. Bug: 27629913 Change-Id: I0afc75ee6e82602b01ec348bbb36a08e8abb8bb8
|
6915898b28cea6c9836ca1be6814d87e89cc6d76 |
|
16-Mar-2016 |
Calin Juravle <calin@google.com> |
Improve compiler stats - report the max size of arena alloc - report how many virtual or interface invokes were inlined Change-Id: I82f154a8e25b5e3890181a1aa11346cdc3f93e37
|
5b1805357b80d780d6afc9e2c70c6544c7ac7e2f |
|
15-Mar-2016 |
Vladimir Marko <vmarko@google.com> |
ART: Fix shift simplification, x >>> 64. Fix braino in https://android-review.googlesource.com/208199 Bug: 27638111 Change-Id: I8f12008af8bba943664c8a9eac3f2d2f7c820e79
|
164306e779de522efba7df637618a8eeed9e37ac |
|
15-Mar-2016 |
Vladimir Marko <vmarko@google.com> |
Optimizing: Improve shift simplification, x >>> 64. Simplify shifts by a multiple of bit size, not just 0. ARM codegen does not expect to see such shifts and it is guarding against them with a DCHECK(). Bug: 27638111 Change-Id: I3ae8383d7edefa0facd375ce511e7a226d5468a1
|
24bd89559c177af9e342f0d5a64a0a2855dfb887 |
|
15-Mar-2016 |
Vladimir Marko <vmarko@google.com> |
Optimizing: Prevent potential valgrind error. This CL preemptively extends the workaround from https://android-review.googlesource.com/208230 to an almost identical bit of code. Bug: 27651442 Change-Id: I7683d42b46b16f2293916defc6ef1d871dc9af6c
|
a65ed3045ec2df95a30994752b3fb0576f479354 |
|
14-Mar-2016 |
Vladimir Marko <vmarko@google.com> |
Optimizing: Fix valgrind error in image_test64. Bug: 27651442 Change-Id: Id9b80c6015dbc3b82966766ca4ad010be770f116
|
625090fe9bf47d8d735c9a66cbf491de3a3e3765 |
|
14-Mar-2016 |
Vladimir Marko <vmarko@google.com> |
Optimizing: Fix TypeConversion(And(x, const)) simplification. Avoid introducing implicit conversions when simplifying the expression TypeConversion(And(x, const)). Previously, when we dropped the And, we could end up with a TypeConversion to the same type which should be eliminated on subsequent pass of the block's instructions; however, a subsequent dependent TypeConversion in the same block would be processed earlier and we would unexpectedly see its input as the conversion to the same type, failing a DCHECK(). Bug: 27626509 Change-Id: I5874a9ceafbf635cf3391beea807ede8468ab5c3
|
bdd7935c2adc3ad190ee87958e714a36f33cedae |
|
14-Feb-2016 |
Anton Shamin <anton.shamin@intel.com> |
Revert "Revert "Revert "Revert "Change condition to opposite if lhs is constant"""" This reverts commit d4aee949b3dd976295201b5310f13aa2df40afa1. Change-Id: I505b8c9863c310a3a708f580b00d425b750c9541
|
1193259cb37c9763a111825aa04718a409d07145 |
|
08-Mar-2016 |
Aart Bik <ajcbik@google.com> |
Implement the 1.8 unsafe memory fences directly in HIR. Rationale: More efficient since it exposes full semantics to all operations on the graph and allows for proper code generation for all architectures. bug=26264765 Change-Id: Ic435886cf0645927a101a8502f0623fa573989ff
|
2a6aad9d388bd29bff04aeec3eb9429d436d1873 |
|
25-Feb-2016 |
Aart Bik <ajcbik@google.com> |
Implement fp to bits methods as intrinsics. Rationale: Better optimization, better performance. Results on libcore benchmark: Most gain is from moving the invariant call out of the loop after we detect everything is a side-effect free intrinsic. But generated code in general case is much cleaner too. Before: timeFloatToIntBits() in 181 ms. timeFloatToRawIntBits() in 35 ms. timeDoubleToLongBits() in 208 ms. timeDoubleToRawLongBits() in 35 ms. After: timeFloatToIntBits() in 36 ms. timeFloatToRawIntBits() in 35 ms. timeDoubleToLongBits() in 35 ms. timeDoubleToRawLongBits() in 34 ms. bug=11548336 Change-Id: I6e001bd3708e800bd75a82b8950fb3a0fc01766e
|
8ffc1fa556eb92f50a0bd3d5eab56435fff206f6 |
|
18-Feb-2016 |
Aart Bik <ajcbik@google.com> |
Set bias on != comparison for isNaN. Change-Id: I83969ecf7252b5e001bdd501c4ca31e7d0608854
|
75a38b24801bd4d27c95acef969930f626dd11da |
|
17-Feb-2016 |
Aart Bik <ajcbik@google.com> |
Implement isNaN intrinsic through HIR equivalent. Rationale: Efficient implementation on all platforms. Subject to better compiler optimizations. Change-Id: Ie8876bf5943cbe1138491a25d32ee9fee554043c
|
8428bd376e660df2ffceee72f797d1cfc6c66433 |
|
12-Feb-2016 |
Vladimir Marko <vmarko@google.com> |
Optimizing: Remove unnecessary And before TypeConversion. For example `(byte) (x & 0xff)` doesn't need the `& 0xff`. Bug: 23965701 Change-Id: I5fc8419491aff2cdc7074451e74e873b5f582d41
|
b52bbde2870e5ab5d126612961dcb3da8e5236ee |
|
12-Feb-2016 |
Vladimir Marko <vmarko@google.com> |
Optimizing: Simplify consecutive type conversions. Merge two consecutive type conversions to one if the result of such merged conversion is guaranteed to be the same and remove all implicit conversions, not just conversions to the same type. Improve codegens to handle conversions from long to integral types smaller than int. This will make it easier to simplify `(byte) (x & 0xffL)` to `(byte) x` where the conversion from long to byte is done by two dex instructions, long-to-int and in int-to-byte. Bug: 23965701 Change-Id: I833f193556671136ad2cd3f5b31cdfbc2d99c19d
|
a19616e3363276e7f2c471eb2839fb16f1d43f27 |
|
02-Feb-2016 |
Aart Bik <ajcbik@google.com> |
Implemented compare/signum intrinsics as HCompare (with all code generation for all) Rationale: At HIR level, many more optimizations are possible, while ultimately generated code can take advantage of full semantics. Change-Id: I6e2ee0311784e5e336847346f7f3c4faef4fd17e
|
9f98025ba5541641cfa9abb7b9cf30332d91fad1 |
|
05-Feb-2016 |
Alexandre Rames <alexandre.rames@linaro.org> |
Extend De Morgan factorisation to `HBooleanNot`. Change-Id: I81aa92277fa136d675e7ef01be8e4acdbd3d3b7c
|
ca0e3a0c9f1fd5902dc40043b061d2f9b79ec098 |
|
03-Feb-2016 |
Alexandre Rames <alexandre.rames@linaro.org> |
Revert "Revert "Optimizing: double-negated bitwise operations simplifications"" This reverts commit 737c0a99dfbba306ec1f50e2adf66b5d97805af6 with fixes. In the original patch, the new instruction could be inserted before one of its inputs. A regression test is also added. Change-Id: Ie49a17ac90ff048355d9cc944b468cd1b1914424
|
74eb1b264691c4eb399d0858015a7fc13c476ac6 |
|
14-Dec-2015 |
David Brazdil <dbrazdil@google.com> |
ART: Implement HSelect This patch adds a new HIR instruction to Optimizing. HSelect returns one of two inputs based on the outcome of a condition. This is only initial implementation which: - defines the new instruction, - repurposes BooleanSimplifier to emit it, - extends InstructionSimplifier to statically resolve it, - updates existing code and tests accordingly. Code generators currently emit fallback if/then/else code and will be updated in follow-up CLs to use platform-specific conditional moves when possible. Change-Id: Ib61b17146487ebe6b55350c2b589f0b971dcaaee
|
737c0a99dfbba306ec1f50e2adf66b5d97805af6 |
|
25-Jan-2016 |
Nicolas Geoffray <ngeoffray@google.com> |
Revert "Optimizing: double-negated bitwise operations simplifications" Fails compiling the Wallet.apk with: dex2oatd F 40736 41007 art/compiler/optimizing/optimizing_compiler.cc:194] Error after instruction_simplifier: art::SSAChecker: Instruction Add:59 in block 4 does not dominate use Or:153 in block 4. This reverts commit 96798493170521691d709be50dd2102ead47b083. Change-Id: Ia4b02e62e6133aa104f5db12ba82d5561b6fc090
|
96798493170521691d709be50dd2102ead47b083 |
|
15-Jan-2016 |
Kevin Brodsky <kevin.brodsky@linaro.org> |
Optimizing: double-negated bitwise operations simplifications Generic instruction simplifications applying to bitwise operations when both inputs are Not's. And and Or are handled by De Morgan's laws, removing one instruction: ~a & ~b -> ~(a | b) ~a | ~b -> ~(a & b) Xor is handled by this trivial relation, removing two instructions: ~a ^ ~b = a ^ b The simplifications only happen when neither Not is used by other instructions. Change-Id: I5d5187af2f625c475c3e49466af6bc3e87595f8f
|
d4aee949b3dd976295201b5310f13aa2df40afa1 |
|
22-Jan-2016 |
Nicolas Geoffray <ngeoffray@google.com> |
Revert "Revert "Revert "Change condition to opposite if lhs is constant""" Fails two checker tests: 458-checker-instruction-simplification 537-checker-jump-over-jump This reverts commit 884e54c8a45e49b58cb1127c8ed890f79f382601. Change-Id: I22553e4e77662736b8b453d911a2f4e601f3a27e
|
884e54c8a45e49b58cb1127c8ed890f79f382601 |
|
22-Jan-2016 |
Nicolas Geoffray <ngeoffray@google.com> |
Revert "Revert "Change condition to opposite if lhs is constant"" This reverts commit a05cacc11fa075246c38497c01b949745fadc54b. Change-Id: Ifdc261fd4dfb2c538017fe1d69af723aafd4afef
|
6de1938e562b0d06e462512dd806166e754035ea |
|
08-Jan-2016 |
David Brazdil <dbrazdil@google.com> |
ART: Remove incorrect HFakeString optimization Simplification of HFakeString assumes that it cannot be used until String.<init> is called which is not true and causes different behaviour between the compiler and the interpreter. This patch removes the optimization together with the HFakeString instruction. Instead, HNewInstance is generated and an empty String allocated until it is replaced with the result of the StringFactory call. This is consistent with the behaviour of the interpreter but is too conservative. A follow-up CL will attempt to optimize out the initial allocation when possible. Bug: 26457745 Bug: 26486014 Change-Id: I7139e37ed00a880715bfc234896a930fde670c44
|
a05cacc11fa075246c38497c01b949745fadc54b |
|
12-Jan-2016 |
Nicolas Geoffray <ngeoffray@google.com> |
Revert "Change condition to opposite if lhs is constant" Breaks arm64 This reverts commit f9f196c55f3b25c3b09350cd8ed5d7ead31f1757. Change-Id: Ie1027a218154b8ded6c1c8f0007720f5be68780d
|
f9f196c55f3b25c3b09350cd8ed5d7ead31f1757 |
|
08-Sep-2015 |
Anton Shamin <anton.shamin@intel.com> |
Change condition to opposite if lhs is constant Swap operands if lhs is constant. Handeled unsigned comparison in insruction simplifier. Fixed NaN comparison: no matter what bias is set result of Equal and NotEqual operations should not depend on it. Added checker tests. Change-Id: I5a9ac25fb10f2705127a52534867cee43368ed1b Signed-off-by: Anton Shamin <anton.shamin@intel.com> Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
|
92d9060c0cdff7c726549a9d9494e5655404bed7 |
|
19-Dec-2015 |
Alexey Frunze <Alexey.Frunze@imgtec.com> |
MIPS: Implement HRor This also fixes differentiation between the SRL and ROTR instructions in the disassembler. Change-Id: Ie19697f8d6ea8fa4e338adde3e3cf8e4a0383eae
|
299a93993fb8f3efbf0465cf674d80c3bcfdc66c |
|
09-Dec-2015 |
Alexey Frunze <Alexey.Frunze@imgtec.com> |
MIPS64: Fuse long and FP compare & condition in Optimizing. Bug: 25559148 Change-Id: I2d14ac75460a76848c71c08cffff6d7a18f5f580
|
cd7b0ee296b0462961c63e51d99c9c323e2690df |
|
04-Dec-2015 |
Alexey Frunze <Alexey.Frunze@imgtec.com> |
MIPS32: Fuse long and FP compare & condition in Optimizing. This also does a minor clean-up in the assembler and its test. Bug: 25559148 Change-Id: I9bad3c500b592a09013b56745f70752eb284a842
|
351dddf4025f07477161209e374741f089d97cb4 |
|
11-Dec-2015 |
Vladimir Marko <vmarko@google.com> |
Optimizing: Clean up after HRor. Change-Id: I96bd7fa2e8bdccb87a3380d063dad0dd57fed9d7
|
40a04bf64e5837fa48aceaffe970c9984c94084a |
|
11-Dec-2015 |
Scott Wakeling <scott.wakeling@linaro.org> |
Replace rotate patterns and invokes with HRor IR. Replace constant and register version bitfield rotate patterns, and rotateRight/Left intrinsic invokes, with new HRor IR. Where k is constant and r is a register, with the UShr and Shl on either side of a |, +, or ^, the following patterns are replaced: x >>> #k OP x << #(reg_size - k) x >>> #k OP x << #-k x >>> r OP x << (#reg_size - r) x >>> (#reg_size - r) OP x << r x >>> r OP x << -r x >>> -r OP x << r Implemented for ARM/ARM64 & X86/X86_64. Tests changed to not be inlined to prevent optimization from folding them out. Additional tests added for constant rotate amounts. Change-Id: I5847d104c0a0348e5792be6c5072ce5090ca2c34
|
f652917de5634b30c974c81d35a72871915b352a |
|
17-Nov-2015 |
Mark Mendell <mark.p.mendell@intel.com> |
Simplify boolean condition compared to 0 CaffeineMarkRR Logic has some boolean flipping which can be helped by some simplification. Simplify non-FP (A COND_OP B) != 0 to A OPPOSITE_COND_OP B. This is better than the original code, which would use a HBooleanNot after the condition. Also simplify non-FP (A COND_OP B) == 1 to A OPPOSITE_COND_OP B. Move GetOppositeCondition to nodes.h/nodes.cc to share with Boolean Simplification, renaming it to InsertOppositeCondition, as it inserts the new HInstruction (unless it is a constant). Change-Id: I34ded7758836e375de0d6fdba9239d2d451928d0 Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
|
f9d741e32c6f1629ce70eefc68d3363fa1cfd696 |
|
20-Nov-2015 |
Vladimir Marko <vmarko@google.com> |
Optimizing/ARM: Improve long shifts by 1. Implement long Shl(x,1) as LSLS+ADC, Shr(x,1) as ASR+RRX and UShr(x,1) as LSR+RRX. Remove the simplification substituting Shl(x,1) with ADD(x,x) as it interferes with some other optimizations instead of helping them. And since it didn't help 64-bit architectures anyway, codegen is the correct place for it. This is now implemented for ARM and x86, so only mips32 can be improved. Change-Id: Idd14f23292198b2260189e1497ca5411b21743b3
|
38db785600757a832423e076b3cf0af3bee942d8 |
|
20-Nov-2015 |
Alexandre Rames <alexandre.rames@linaro.org> |
Opt compiler: More strength reduction for multiplications. We transform code looking like MUL dst, src, (2^n + 1) into SHL tmp, src, n ADD dst, src, tmp and code looking like MUL dst, src, (2^n - 1) into SHL tmp, src, n SUB dst, tmp, src Change-Id: Ia620ab68758caa70a01530b88cd65dd0444376d7
|
f652cecb984c104d44a0223c3c98400ef8ed8ce2 |
|
25-Aug-2015 |
Goran Jakovljevic <Goran.Jakovljevic@imgtec.com> |
MIPS: Initial version of optimizing compiler for MIPS32 Change-Id: I370388e8d5de52c7001552b513877ef5833aa621
|
bb245d199a5240b4c520263fd2c8c10dba79eadc |
|
19-Oct-2015 |
Aart Bik <ajcbik@google.com> |
Generalize codegen and simplification of deopt. Rationale: the de-opt instruction is very similar to an if, so the existing assumption that it always has a conditional "under the hood" is very unsafe, since optimizations may have replaced conditionals with actual values; this CL generalizes handling of deopt. Change-Id: I1c6cb71fdad2af869fa4714b38417dceed676459
|
e9f37600e98ba21308ad4f70d9d68cf6c057bdbe |
|
09-Oct-2015 |
Aart Bik <ajcbik@google.com> |
Added support for unsigned comparisons Rationale: even though not directly supported in input graph, having the ability to express unsigned comparisons in HIR is useful for all sorts of optimizations. Change-Id: I4543c96a8c1895c3d33aaf85685afbf80fe27d72
|
ee3cf0731d0ef0787bc2947c8e3ca432b513956b |
|
06-Oct-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Intrinsify System.arraycopy. Currently on x64, will do the other architectures in different changes. Change-Id: I15fbbadb450dd21787809759a8b14b21b1e42624
|
e53fb5582f8f6ece5d0ce3b9c0d5b1cdb654b254 |
|
07-Oct-2015 |
Calin Juravle <calin@google.com> |
Don't remove type checks if we need to perform an access check. Change-Id: I9b9e07c7524e96ece8dc089c8379631c2f9e3320
|
a83a54d7f2322060f08480f8aabac5eb07268912 |
|
02-Oct-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Add support for intrinsic optimizations. Change-Id: Ib5a4224022f9360e60c09a19ac8642270a7f3b64
|
98893e146b0ff0e1fd1d7c29252f1d1e75a163f2 |
|
02-Oct-2015 |
Calin Juravle <calin@google.com> |
Add support for unresolved classes in optimizing. Change-Id: I0e299a81e560eb9cb0737ec46125dffc99333b54
|
e0395dd58454e27fc47c0ca273913929fb658e6c |
|
25-Sep-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Optimize ArraySet for x86/x64/arm/arm64. Change-Id: I5bc8c6adf7f82f3b211f0c21067f5bb54dd0c040
|
452c1b60120aee0883c3339b363f820b8d69c299 |
|
25-Sep-2015 |
Vladimir Marko <vmarko@google.com> |
Optimizing: Simplify UShr+And, Shr+And. Eliminate And from UShr+And if the And-mask contains all the bits that can be non-zero after UShr. Transform Shr+And to UShr if the And-mask precisely clears the shifted-in sign bits. This prepares for detecting the Rotate pattern, i.e. (x << N) | (x >>> (SIZE - N)) in code that unnecessarily masks the UShr, for example (x << 1) | ((x >>> 31) & 1) , or uses Shr, for example (x << 8) | ((x >> 24) & 0xff) . Change-Id: I684c4b752547d9b1057d0d4c4d44550bb1a3ffb4
|
6e7455e90411c77088af5fcbf828219842bd2182 |
|
28-Sep-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Use dominance information for null optimization in write barrier. Change-Id: I8b57dafcd321c9afa1bbfc6a0674cbea15cbf10c
|
aae9e66a727756bc965121a60ffcef89ed370e6c |
|
21-Aug-2015 |
Serdjuk, Nikolay Y <nikolay.y.serdjuk@intel.com> |
ART: Fix the simplifier for NEGATE add/sub Instruction simplifier for negate add/sub should not proceed with floats because that might cause the incorrect behavior with signed zero. Change-Id: I4970694a2b265a3577cde34fee9cd3a437358c0f
|
efa8468c78fdd808043dfb664b56541f3f2dd0e8 |
|
13-Aug-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Small optimization improvements. - Tune CanBeNull for HBoundType. - Remove LoadClass when we know the class is loaded. - Tune CanBeNull for StringInit. Change-Id: I564ed33a506d65e991a514342bdfd1610bed0cf5
|
f2ea71cdb3ee4f5198bc0298aa8be1f9e945ee1c |
|
05-Aug-2015 |
Serguei Katkov <serguei.i.katkov@intel.com> |
ART: Fix the simplifier for add/sub Instruction simplifier for add/sub should not proceed with floats because that might cause the incorrect behavior with signed zero. Bug: 23001681 Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com> (cherry picked from commit 115b53f609e74672fa93eea1845bb17340d5112a) Change-Id: I9928724c4158b3961e32e376b9203fe01ba2e442
|
115b53f609e74672fa93eea1845bb17340d5112a |
|
05-Aug-2015 |
Serguei Katkov <serguei.i.katkov@intel.com> |
ART: Fix the simplifier for add/sub Instruction simplifier for add/sub should not proceed with floats because that might cause the incorrect behavior with signed zero. Change-Id: If0c9bf3931bcbf96b0814f8605a86997aea37145 Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
|
2e76830f0b3f23825677436c0633714402715099 |
|
28-Jul-2015 |
Calin Juravle <calin@google.com> |
Revert "Revert "Revert "Revert "Use the object class as top in reference type propagation"""" This reverts commit b734808d0c93af98ec4e3539fdb0a8c0787263b0. Change-Id: Ifd925f166761bcb9be2268ff0fc9fa3a72f00c6f
|
b734808d0c93af98ec4e3539fdb0a8c0787263b0 |
|
28-Jul-2015 |
Calin Juravle <calin@google.com> |
Revert "Revert "Revert "Use the object class as top in reference type propagation""" This reverts commit 80caa1478cf3df4eac1214d8a63a4da6f4fe622b. Change-Id: I63b51ca418b19b2bfb5ede3f8444f8fbeb8a339d
|
80caa1478cf3df4eac1214d8a63a4da6f4fe622b |
|
16-Jul-2015 |
Calin Juravle <calin@google.com> |
Revert "Revert "Use the object class as top in reference type propagation"" This reverts commit 7733bd644ac71f86d4b30a319624b23343882e53. Change-Id: I7d393a808c01c084c18d632a54e0554b4b455f2c
|
7733bd644ac71f86d4b30a319624b23343882e53 |
|
22-Jul-2015 |
Calin Juravle <calin@google.com> |
Revert "Use the object class as top in reference type propagation" This reverts commit 3fabec7a25d151b26ba7de13615bbead0dd615a6. Change-Id: Id8614f6b6e3e0e4c9caeb9f771e4c145d9fec64f
|
3fabec7a25d151b26ba7de13615bbead0dd615a6 |
|
16-Jul-2015 |
Calin Juravle <calin@google.com> |
Use the object class as top in reference type propagation This properly types all instructions, making it safe to query the type at any time. This also moves a few functions from class.h to class-inl.h to please gcc linker when compiling for target. Change-Id: I6b7ce965c10834c994b95529ab65a548515b4406
|
7f63c52c8e94ed1340b7a1d04b046ff12819d2bc |
|
13-Jul-2015 |
Roland Levillain <rpl@google.com> |
Revert "Revert "Fuse long and FP compare & condition on ARM64 in Optimizing."" This reverts commit bed50d2430e02a3d6b94972e8ab4873d7b3b8be0. Bug: 21120453 Change-Id: I5e4aab2703966d9324ebde25bd8b83056fdb10ed
|
2e7cd752452d02499a2f5fbd604c5427aa372f00 |
|
10-Jul-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
[optimizing] Don't rely on the verifier for String.<init>. Continue work on cutting the dependency on the verifier. Change-Id: I0f95b1eb2e10fd8f6bf54817f1202bdf6dfdb0fe
|
bed50d2430e02a3d6b94972e8ab4873d7b3b8be0 |
|
10-Jul-2015 |
Roland Levillain <rpl@google.com> |
Revert "Fuse long and FP compare & condition on ARM64 in Optimizing." This reverts commit 5cfe61f27ed9203498169355bb95db756486d292. Change-Id: I9879e76e7f8315cace05700e3b571a6a4749bf1a
|
5cfe61f27ed9203498169355bb95db756486d292 |
|
10-Jul-2015 |
Roland Levillain <rpl@google.com> |
Fuse long and FP compare & condition on ARM64 in Optimizing. Bug: 21120453 Change-Id: I701e808600fb5ba9ff4d0f5e19e4ce22b1d34b29
|
4fa13f65ece3b68fe3d8722d679ebab8656bbf99 |
|
06-Jul-2015 |
Roland Levillain <rpl@google.com> |
Fuse long and FP compare & condition on ARM in Optimizing. Also: - Stylistic changes in corresponding parts on the x86 and x86-64 code generators. - Update and improve the documentation of art::arm::Condition. Bug: 21120453 Change-Id: If144772046e7d21362c3c2086246cb7d011d49ce
|
c470193cfc522fc818eb2eaab896aef9caf0c75a |
|
10-Apr-2015 |
Mark Mendell <mark.p.mendell@intel.com> |
Fuse long and FP compare & condition on x86/x86-64 in Optimizing. This is a preliminary implementation of fusing long/float/double compares with conditions to avoid materializing the result from the compare and condition. The information from a HCompare is transferred to the HCondition if it is legal. There must be only a single use of the HCompare, the HCompare and HCondition must be in the same block, the HCondition must not need materialization. Added GetOppositeCondition() to HCondition to return the flipped condition. Bug: 21120453 Change-Id: I1f1db206e6dc336270cd71070ed3232dedc754d6 Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
|
9fdb31e12023d94c710a766a54d8a57c91a196f9 |
|
01-Jul-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Do not do a type check when setting null to an array. Change-Id: I7387d45aea697d4a3de273335647220a815a992b
|
0bc614dfaff593d77eb698c279044db44bad4a4b |
|
19-Jun-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Do not expect 0 or 1 only when comparing a boolean. bug:21866529 (cherry picked from commit 3c4ab80c102ff1bfc0e74d4abddbf5454bf4008d) Change-Id: Ibdc0d4a9730bfc6e7307282276f084dae5ac55c1
|
1e9ec053008fca7eb713815716c69375c37b399c |
|
22-Jun-2015 |
David Brazdil <dbrazdil@google.com> |
ART: Simplify (Not)Equal bool vs. int to true/false Optimizations on the HGraph may produce comparisons of bool and ints. Instruction simplifier will simplify these only for 0/1 int constants. Since the range of bool is known, comparison against all other int constants can always be determined statically. Change-Id: I502651b7a08edf71ee0b2589069f00def6aacf66
|
3c4ab80c102ff1bfc0e74d4abddbf5454bf4008d |
|
19-Jun-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Do not expect 0 or 1 only when comparing a boolean. bug:21866529 Change-Id: I81ffba609a357010bd86073eb979024fc668ed20
|
7cb499b1af1575c854860b0d6a103c4a2a59a569 |
|
17-Jun-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Fix bug in optimizing around instanceof. We were too aggressive when removing instanceof. We should not remove it when there is one of the two static types that is an interface. Change-Id: I1fd80915b99b094f7b4393e7adb2b160201b30d5
|
222862ceaeed48528020412ef4f7b1cdaecf8789 |
|
09-Jun-2015 |
Guillaume Sanchez <guillaumesa@google.com> |
Add optimizations for instanceof/checkcast. The optimizations try to statically determine the outcome of the type tests, replacing/removing the instructions when possible. This required to fix the is_exact flag for ReferenceTypePropagation. Change-Id: I6cea29b6c351d118b62060e8420333085e9383fb
|
07276db28d654594e0e86e9e467cad393f752e6e |
|
18-May-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Don't do a null test in MarkGCCard if the value cannot be null. Change-Id: I45687f6d3505178e2fc3689eac9cb6ab1b2c1e29
|
8909bafa5d64e12eb53f3d37b984f53e7a632224 |
|
23-Apr-2015 |
Guillaume "Vermeille" Sanchez <guillaumesa@google.com> |
Mark CheckCast's and InstanceOf's input as !CanBeNull if used before in a NullCheck Change-Id: Ied0412a01922b40a3f5d89bed49707498582abc1
|
ba56d060116d6e145be348fa575314654c6b0572 |
|
06-May-2015 |
Mark Mendell <mark.p.mendell@intel.com> |
[optimizing] Improve 32 bit long shift by 1. Also change FOO << 1 to FOO+FOO in the instruction simplifier. This is an architecture independent simplification, which helps 'long << 1' for 32 bit architectures. Generate an add/adc for long << 1 in x86, in case something is generated after the simplifier. Add test cases for the simplification. Change-Id: I0d512331ef13cc4ccf10c80f11c370a10ed02294 Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
|
0d22184ec9e5b1e958c031ac92c7f053de3a13a2 |
|
27-Apr-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Revert "Revert "[optimizing] Replace FP divide by power of 2"" This reverts commit 067cae2c86627d2edcf01b918ee601774bc76aeb. Change-Id: Iaaa8772500ea7d3dce6ae0829dc0dc3bbc9c14ca
|
067cae2c86627d2edcf01b918ee601774bc76aeb |
|
26-Apr-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Revert "[optimizing] Replace FP divide by power of 2" Fails compiling docs. This reverts commit b0bd8915cb257cdaf46ba663c450a6543bca75af. Change-Id: I47d32525c83a73118e2163eb58c68bbb7a28bb38
|
af88835231c2508509eb19aa2d21b92879351962 |
|
20-Apr-2015 |
Guillaume "Vermeille" Sanchez <guillaumesa@google.com> |
Remove unnecessary null checks in CheckCast and InstanceOf Change-Id: I6fd81cabd8673be360f369e6318df0de8b18b634
|
538491967d1514a263e99d78379d743fcc896eef |
|
20-Apr-2015 |
Serguei Katkov <serguei.i.katkov@intel.com> |
Mul simplification should expect zero operand It is possible that zero constant can appear due to simplification of other instructions, so we cannot expect zero handling from constant optimizations. Change-Id: I084126fd0c106ac2683c4f10a451960d9807f4f6 Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
|
943136fd031f4fe18f6e8a956c72171d7cf78da0 |
|
22-Apr-2015 |
Calin Juravle <calin@google.com> |
Remove warning when we do too many simplifications This happens pretty often and pollutes the logs. Change-Id: I074783d3cf3519a5186d2dd81c821d97071302e7
|
b0bd8915cb257cdaf46ba663c450a6543bca75af |
|
16-Apr-2015 |
Mark Mendell <mark.p.mendell@intel.com> |
[optimizing] Replace FP divide by power of 2 Replace a floating point division by a power of two by a multiplication of the reciprocal. This is guarenteed to have the exact same result as it is exactly representable. Add routines to allow generation of float and double constants after the SSA Builder. I was unsure if float and double caches should be implemented. Under the assumption that there is probably not a lot of repetition of FP values. Please let me know. Change-Id: I3a6c3847b49b4e747a7e7e8843ca32bb174b1584 Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
|
339dfc209ad93482269eea1386e79973abc313cf |
|
19-Apr-2015 |
Serguei Katkov <serguei.i.katkov@intel.com> |
Incorrect transformation of (sub,neg) to (sub) for fp A pair (sub,neg) should not be transformed to (sub) for floating point operations, otherwise we can lose the sign of zero for instructions like this: - (A - B) != B - A if B == A Change-Id: I4d612612d4dc0a067fac5721ad206f74168bcd36 Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
|
0d13fee6f4330cc9cb100c43135490a34c11d7a5 |
|
17-Apr-2015 |
David Brazdil <dbrazdil@google.com> |
ART: Simplify more bool operations Now that we have the HBooleanNot instruction, the instruction simplifier can optimize out more conditions comparing a boolean against a constant, as well as sequences of Boolean negations. Change-Id: I7f634f6428a3984dd97b27b3d6362491346f1ff6
|
188d4316a880ae24aed315aa52dc503c4fcb1ec7 |
|
09-Apr-2015 |
Alexandre Rames <alexandre.rames@arm.com> |
Opt compiler: Instruction simplification for HAdd, HNeg, HNot, HSub. Under assumptions for the 'cost' of each IR (eg. neither HAdd nor HSub are faster than the other), transformations are only applied if they (locally) cannot degrade the quality of the graph. The code could be extended to look at uses of the IRs and detect more opportunities for optimisations. The optimisations in this patch do not look at other uses for their inputs. Change-Id: Ib60dab007af30f43421ef5bb55db2ec32fb8fc0c
|
8d5b8b295930aaa43255c4f0b74ece3ee8b43a47 |
|
24-Mar-2015 |
David Brazdil <dbrazdil@google.com> |
ART: Force constants into the entry block Optimizations such as GVN and BCE make the assumption that all constants are located in the entry block of the CFG, but not all passes adhere to this rule. This patch makes constructors of constants private and only accessible to friend classes - HGraph for int/long constants and SsaBuilder for float/double - which ensure that they are placed correctly and not duplicated. Note that the ArenaAllocatorAdapter was modified to not increment the ArenaAllocator's internal reference counter in order to allow for use of ArenaSafeMap inside an arena-allocated objects. Because their destructor is not called, the counter does not get decremented. Change-Id: I36a4fa29ae34fb905cdefd482ccbf386cff14166
|
b2fd7bca70b580921eebf7c45769c39d2dfd8a5a |
|
11-Mar-2015 |
Alexandre Rames <alexandre.rames@arm.com> |
Opt compiler: Basic simplification for arithmetic operations. The optimisations in this patch do not look further than the inputs of each operation. Change-Id: Iddd0ab6b360b9e7bb042db22086d51a31be85530
|
acf735c13998ad2a175f5a17e7bfce220073279d |
|
12-Feb-2015 |
Calin Juravle <calin@google.com> |
Reference type propagation - propagate reference types between instructions - remove checked casts when possible - add StackHandleScopeCollection to manage an arbitrary number of stack handles (see comments) Change-Id: I31200067c5e7375a5ea8e2f873c4374ebdb5ee60
|
0304e182adee81be32c744fd3c0d28add29974ff |
|
31-Jan-2015 |
Mingyao Yang <mingyao@google.com> |
Improve bce so that more bounds checks can be eliminated. For pattern like "int[] array = new int[size+1]", we record this range for size: [-1, array.length-1] This can eliminate more bounds checks. Also simplify overflow/underflow handling and make it more solid. Enhance instruction simplifier such that if array is a result of NewArray with a constant size, replace array.length with that constant. Plan to move all bce gtests to checker in another change. Change-Id: Ibe7cc7940b68fb6465dc3e0ff3ebdb0fd6487aa9
|
10e244f9e7f6d96a95c910a2bedef5bd3810c637 |
|
26-Jan-2015 |
Calin Juravle <calin@google.com> |
optimizing: NullCheck elimination How it works: - run a type analysis to propagate null information on instructions - during the last instruction simplifier remove null checks for which the input is known to be not null The current type analysis is actually a nullability analysis but it will be reused in follow up CLs to propagate type information: so it keeps the more convenient name. Change-Id: I54bb1d32ab24604b4d677d1ecdaf8d60a5ff5ce9
|
fa93b504b324784dd9a96e28e6e8f3f1b1ac456a |
|
21-Jan-2015 |
Nicolas Geoffray <ngeoffray@google.com> |
Do not use HNot for creating !bool. HNot folds to ~, not !. Change-Id: I681f968449a2ade7110b2f316146ad16ba5da74c
|
01fcc9ee556f98d0163cc9b524e989760826926f |
|
01-Dec-2014 |
Nicolas Geoffray <ngeoffray@google.com> |
Remove type conversion nodes converting to the same type. When optimizing, we ensure these conversions do not reach the code generators. When not optimizing, we cannot get such situations. Change-Id: I717247c957667675dc261183019c88efa3a38452
|
5e6916cea259897baaca019c5c7a5d05746306ed |
|
18-Nov-2014 |
Nicolas Geoffray <ngeoffray@google.com> |
Use HOptimization abstraction for running optimizations. Move existing optimizations to it. Change-Id: I3b43f9997faf4ed8875162e3a3abdf99375478dd
|
af07bc121121d7bd7e8329c55dfe24782207b561 |
|
12-Nov-2014 |
Nicolas Geoffray <ngeoffray@google.com> |
Minor object store optimizations. - Avoid emitting write barrier when the value is null. - Do not do a typecheck on an arraystore when storing something that was loaded from the same array. Change-Id: I902492928692e4553b5af0fc99cce3c2186c442a
|
1cc5f251df558b0e22cea5000626365eb644c727 |
|
22-Oct-2014 |
Roland Levillain <rpl@google.com> |
Implement int bit-wise not operation in the optimizing compiler. - Add support for the not-int (integer one's complement negate) instruction in the optimizing compiler. - Extend the HNot control-flow graph node type and make it inherit from HUnaryOperation. - Generate ARM, x86 and x86-64 code for integer HNeg nodes. - Exercise these additions in the codegen_test gtest, as there is not direct way to assess the support of not-int from a Java source. Indeed, compiling a Java expression such as `~a' using javac and then dx generates an xor-int/lit8 Dex instruction instead of the expected not-int Dex instruction. This is probably because the Java bytecode has an `ixor' instruction, but there's not instruction directly corresponding to a bit-wise not operation. Change-Id: I223aed75c4dac5785e04d99da0d22e8d699aee2b
|
01ef345767ea609417fc511e42007705c9667546 |
|
01-Oct-2014 |
Nicolas Geoffray <ngeoffray@google.com> |
Add trivial register hints to the register allocator. - Add hints for phis, same as first input, and expected registers. - Make the if instruction accept non-condition instructions. Change-Id: I34fa68393f0d0c19c68128f017b7a05be556fbe5
|
3c04974a90b0e03f4b509010bff49f0b2a3da57f |
|
24-Sep-2014 |
Nicolas Geoffray <ngeoffray@google.com> |
Optimize suspend checks in optimizing compiler. - Remove the ones added during graph build (they were added for the baseline code generator). - Emit them at loop back edges after phi moves, so that the test can directly jump to the loop header. - Fix x86 and x86_64 suspend check by using cmpw instead of cmpl. Change-Id: I6fad5795a55705d86c9e1cb85bf5d63dadfafa2a
|