summaryrefslogtreecommitdiffstats
path: root/compiler
Commit message (Collapse)AuthorAgeFilesLines
* [optimizing compiler] Add division for floats and doublesCalin Juravle2014-10-286-25/+211
| | | | | | | | | | backends: x86, x86_64, arm. Also: - ordered instructions based on their name. - add missing kNoOutputOverlap to add/sub/mul. Change-Id: Ie47cde3b15ac74e7a1660c67a2eed1d7871f0ad0
* Merge "Add long bitwise not instruction in the optimizing compiler."Roland Levillain2014-10-286-5/+25
|\
| * Add long bitwise not instruction in the optimizing compiler.Roland Levillain2014-10-276-5/+25
| | | | | | | | | | | | | | | | | | | | | | | | - Add support for the not-long (long integer one's complement negation) instruction in the optimizing compiler. - Add a 64-bit NOT instruction (notq) to the x86-64 assembler. - Generate ARM, x86 and x86-64 code for long HNot nodes. - Gather not-related tests in test/416-optimizing-arith-not. Change-Id: I2d5b75e9875664d6032d04f8401b2bbb84506948
* | ART: Add support for patching and loading OAT files compiled with PICIgor Murashkin2014-10-274-13/+20
| | | | | | | | | | | | | | | | | | | | | | | | * Images (.art) compiled with pic now have a new field added. * isDexOptNeeded will now skip patch-ing for apps compiled PIC * First-boot patching now only copies boot.art, boot.oat is linked As a result, all system preopted dex files (with --compile-pic) no longer take up any space in /data/dalvik-cache/<isa>. Bug: 18035729 Change-Id: Ie1acad81a0fd8b2f24e1f3f07a06e6fdb548be62
* | Optimize method linkingMathieu Chartier2014-10-271-5/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added more inlining, removed imt array allocation and replaced it with a handle scope. Removed some un-necessary handle scopes. Added logic to base interface method tables from the superclass so that we dont need to reconstruct for every interface (large win). Facebook launch Dalvik KK MR2: TotalTime: 3165 TotalTime: 3652 TotalTime: 3143 TotalTime: 3298 TotalTime: 3212 TotalTime: 3211 Facebook launch TOT before: WaitTime: 3702 WaitTime: 3616 WaitTime: 3616 WaitTime: 3687 WaitTime: 3742 WaitTime: 3767 After optimizations: WaitTime: 2903 WaitTime: 2953 WaitTime: 2918 WaitTime: 2940 WaitTime: 2879 WaitTime: 2792 LinkInterfaceMethods no longer one of the hottest methods, new list: 4.73% art::ClassLinker::LinkVirtualMethods(art::Thread*, art::Handle<art::mirror::Class>) 3.07% art::DexFile::FindClassDef(char const*) const 2.94% art::mirror::Class::FindDeclaredStaticField(art::mirror::DexCache const*, unsigned int) 2.90% art::DexFile::FindStringId(char const*) const Bug: 18054905 Bug: 16828525 (cherry picked from commit 1fb463e42cf1d67595cff66d19c0f99e3046f4c4) Change-Id: I27cc70178fd3655fbe5a3178887fcba189d21321
* | Merge "Rewrite class initialization check elimination."Vladimir Marko2014-10-2717-229/+541
|\ \ | |/ |/|
| * Rewrite class initialization check elimination.Vladimir Marko2014-10-2717-229/+541
| | | | | | | | | | | | | | | | Split the notion of type being in dex cache away from the class being initialized. Include static invokes in the class initialization elimination pass. Change-Id: Ie3760d8fd55b987f9507f32ef51456a57d79e3fb
* | Support hard float on arm in optimizing compiler.Nicolas Geoffray2014-10-276-134/+187
|/ | | | | | Also bump oat version, needed after latest hard float switch. Change-Id: Idf5acfb36c07e74acff00edab998419a3c6b2965
* Merge "Quick: Fix wide Phi detection in GVN, clean up INVOKEs."Vladimir Marko2014-10-275-38/+173
|\
| * Quick: Fix wide Phi detection in GVN, clean up INVOKEs.Vladimir Marko2014-10-235-38/+173
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The detection of a wide Phi has been incorrectly looking at the current LVN's wide sreg value map but we only intersect live values and thus very often lose the information. This results in failure to identify identical values, i.e. potential missed optimizations. It also caused the bloating of the global value map with values we would not use. Rewrite the wide Phi detection to use the first merged LVN's notion of wide sreg. For this to work we also need to use the method's shorty to mark wide arguments. Also clean up INVOKEs' processing to avoid another source of bloating the global value map. Bug: 16398693 Change-Id: I76718af7d62a8c6883ef43e4f47058f7eaf479e1
* | Merge "Tidy logging code not using UNIMPLEMENTED."Ian Rogers2014-10-259-11/+17
|\ \
| * | Tidy logging code not using UNIMPLEMENTED.Ian Rogers2014-10-249-11/+17
| | | | | | | | | | | | Change-Id: I7a79c1671a6ff8b2040887133b3e0925ef9a3cfe
* | | ARM: Use hardfp calling convention between java to java call.Zheng Xu2014-10-2412-85/+708
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch default to use hardfp calling convention. Softfp can be enabled by setting kArm32QuickCodeUseSoftFloat to true. We get about -1 ~ +5% performance improvement with different benchmark tests. Hopefully, we should be able to get more performance by address the left TODOs, as some part of the code takes the original assumption which is not optimal. DONE: 1. Interpreter to quick code 2. Quick code to interpreter 3. Transition assembly and callee-saves 4. Trampoline(generic jni, resolution, invoke with access check and etc.) 5. Pass fp arg reg following aapcs(gpr and stack do not follow aapcs) 6. Quick helper assembly routines to handle ABI differences 7. Quick code method entry 8. Quick code method invocation 9. JNI compiler TODO: 10. Rework ArgMap, FlushIn, GenDalvikArgs and affected common code. 11. Rework CallRuntimeHelperXXX(). Change-Id: I9965d8a007f4829f2560b63bcbbde271bdcf6ec2
* | | Merge "ART: Add div/rem zero check elimination flag"Ian Rogers2014-10-2414-92/+109
|\ \ \
| * | | ART: Add div/rem zero check elimination flagRazvan A Lupusoru2014-10-1414-92/+109
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Just as with other throwing bytecodes, it is possible to prove in some cases that a divide/remainder won't throw ArithmeticException. For example, in case two divides with same denominator are in order, then provably the second one cannot throw if the first one did not. This patch adds the elimination flag and updates the signature of several Mir2Lir methods to take the instruction optimization flags into account. Change-Id: I0b078cf7f29899f0f059db1f14b65a37444b84e8 Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
* | | | ART: Prevent float inference back to SSA in-regs.Stephen Kyle2014-10-241-0/+13
| |/ / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | .method public static getInt(I)I .registers 2 const/4 v0, 0x0 if-ne v0, v0, :after float-to-int v0, v0 :exit add-int/2addr v0, v1 return v0 :after move v1, v0 goto :exit .end method In this code sample, v1 is the single parameter to this method. In one of the phi-nodes inserted between :exit and add-int/2addr, v1's two incoming SSA regs are: - the initial def of v1 as a parameter - the v1 def'd at move v1, v0. During type inference, because the 2nd def is a float (because of the earlier float-to-int v0, v0) this will change the type of the 1st def to a float as well, which is incorrect since the first parameter is known to be non-float. This fix checks during phi-node type-inference if an SSA reg that is the initial def of a parameter vreg is about to be set as float when it was not previously, and skips the inference if so. In this case, when using a hard-float ABI, having the in-reg v1 set as float causes FlushIns() to read the argument to the method from an FP reg, when the argument will be passed in a core reg by any caller. Also included is a smali test for this bug: compare difference between ./run-test --64 800 ./run-test --64 --interpreter 800 when the vreg_analysis patch has not been applied. (Requires 64-bit because 32-bit ARM currently does not use hard-float.) getInt(I)I should return its argument, but it returns an incorrect value. Change-Id: I1d4b5be6a931fe853279e89dd820820f29823da1 Signed-off-by: Stephen Kyle <stephen.kyle@arm.com>
* | | Fix encoding of imul in x86_64 assembler.Nicolas Geoffray2014-10-242-1/+10
| | | | | | | | | | | | Change-Id: I5b97f5698ed8ec9d0759d0e1eba8be29119c16c5
* | | Merge "Revert "Revert "Implement long negate instruction in the optimizing ↵Roland Levillain2014-10-246-4/+54
|\ \ \ | | | | | | | | | | | | compiler."""
| * | | Revert "Revert "Implement long negate instruction in the optimizing compiler.""Roland Levillain2014-10-246-4/+54
| | | | | | | | | | | | | | | | | | | | | | | | This reverts commit 30ca3d847fe72cfa33e1b2473100ea2d8bea4517. Change-Id: I188ca8d460d55d3a9966bcf31e0588575afa77d2
* | | | Merge "Fix wrong unsigned to signed conversions."Nicolas Geoffray2014-10-242-6/+10
|\ \ \ \ | |/ / / |/| | |
| * | | Fix wrong unsigned to signed conversions.Nicolas Geoffray2014-10-232-6/+10
| | | | | | | | | | | | | | | | | | | | | | | | The HIntConstant node takes an int32_t, so we have to keep things signed. Change-Id: Ib3fa50e87f99118d320cbb381f619d5be9287530
* | | | Merge "ART: Add basic tests for materialized conditions."Nicolas Geoffray2014-10-231-0/+117
|\ \ \ \
| * | | | ART: Add basic tests for materialized conditions.Alexandre Rames2014-10-231-0/+117
| |/ / / | | | | | | | | | | | | Change-Id: I4acef30cc6a48b5fe07d55db6b9cf0d093b326ee
* | | | Revert "Implement long negate instruction in the optimizing compiler."Roland Levillain2014-10-236-43/+4
|/ / / | | | | | | | | | This reverts commit 66ce173a40eff4392e9949ede169ccf3108be2db.
* | | Implement long negate instruction in the optimizing compiler.Roland Levillain2014-10-236-4/+43
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Add support for the neg-long (long integer two's complement negate) instruction in the optimizing compiler. - Add a 64-bit NEG instruction (negq) to the x86-64 assembler. - Generate ARM, x86 and x86-64 code for integer HNeg nodes. - Put neg-related tests into test/415-optimizing-arith-neg. Change-Id: I1fbe9611e134408a6b8745d1df20ab6ffa5e50f2
* | | [optimizing compiler] Handle SUB_FLOAT/DOUBLE nodesCalin Juravle2014-10-231-0/+20
| | | | | | | | | | | | | | | | | | | | | Also add 414-optimizing-arith-sub to TEST_ART_BROKEN_OPTIMIZING_ARM64_RUN_TESTS. Change-Id: Ia1b7ff7857bc0e488b9b8ed8a36efb1a3a9bad36
* | | [optimizing compiler] Add float/double subtractionCalin Juravle2014-10-233-101/+89
| | | | | | | | | | | | | | | | | | | | | | | | - for arm, x86, x86_64 - add tests - a bit of clean up Change-Id: I3761b0d908aca3e3c5d60da481fafb423ff7c9b9
* | | ART: optimizing compiler: initial support for ARM64.Alexandre Rames2014-10-238-4/+1472
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The ARM64 port uses VIXL for code generation, to which it defers work like label binding and branch resolving, register type coherency checking, and immediate values handling. Change-Id: I0a44508c0c991f472a63e67b3469cdd878fe1a68 Signed-off-by: Serban Constantinescu <serban.constantinescu@arm.com> Signed-off-by: Alexandre Rames <alexandre.rames@arm.com>
* | | Remove obsolete TODOs from codegen testsCalin Juravle2014-10-231-3/+1
| | | | | | | | | | | | | | | | | | The features are already exercised by the art test 411-optimizing-arith. Change-Id: Id008931e0ed8206ced11ecc85a80a7e4aef3e68e
* | | Merge "Implement int bit-wise not operation in the optimizing compiler."Roland Levillain2014-10-237-22/+102
|\ \ \
| * | | Implement int bit-wise not operation in the optimizing compiler.Roland Levillain2014-10-237-22/+102
| | |/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - 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
* | | C++11 related clean-up of DISALLOW_..Ian Rogers2014-10-229-41/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Move DISALLOW_COPY_AND_ASSIGN to delete functions. By no having declarations with no definitions this prompts better warning messages so deal with these by correcting the code. Add a DISALLOW_ALLOCATION and use for ValueObject and mirror::Object. Make X86 assembly operand types ValueObjects to fix compilation errors. Tidy the use of iostream and ostream. Avoid making cutils a dependency via mutex-inl.h for tests that link against libart. Push tracing dependencies into appropriate files and mutex.cc. x86 32-bit host symbols size is increased for libarttest, avoid copying this in run-test 115 by using symlinks and remove this test's higher than normal ulimit. Fix the RunningOnValgrind test in RosAllocSpace to not use GetHeap as it returns NULL when the heap is under construction by Runtime. Change-Id: Ia246f7ac0c11f73072b30d70566a196e9b78472b
* | | Merge "Tidy up logging."Ian Rogers2014-10-226-47/+62
|\ \ \ | |/ / |/| |
| * | Tidy up logging.Ian Rogers2014-10-226-47/+62
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Move gVerboseMethods to CompilerOptions. Now "--verbose-methods=" option to dex2oat rather than runtime argument "-verbose-methods:". Move ToStr and Dumpable out of logging.h, move LogMessageData into logging.cc except for a forward declaration. Remove ConstDumpable as Dump methods are all const (and make this so if not currently true). Make LogSeverity an enum and improve compile time assertions and type checking. Remove log_severity.h that's only used in logging.h. With system headers gone from logging.h, go add to .cc files missing system header includes. Also, make operator new in ValueObject private for compile time instantiation checking. Change-Id: I3228f614500ccc9b14b49c72b9821c8b0db3d641
* | | Merge "X86 Long Min/Max: Avoid calling SRegToVReg with -1"Vladimir Marko2014-10-221-0/+5
|\ \ \
| * | | X86 Long Min/Max: Avoid calling SRegToVReg with -1Mark Mendell2014-10-221-0/+5
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It is possible that the result of a call to min/max can't be combined with the following move. In that case, the destination will use the default long return value (EAX/EDX), with a s_reg_low value of -1. A debug compiler will assert fail in that case. Fix: A result with no s_reg_low must be unused. Just return with no code generated, like X86 GenInlinedAbsFloat(). Seen compiling GmsCore.apk on the host with a debug backend. Change-Id: I8006e822e8dcb2112d86e4047bb2e3037ba6fece Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
* | | Minor fix in codegen tests.Calin Juravle2014-10-221-1/+1
| | | | | | | | | | | | Change-Id: I9b843536353d4f820b969895d5f75ee9b679aff0
* | | Add multiplication for floats/doubles in optimizing compilerCalin Juravle2014-10-224-38/+71
| | | | | | | | | | | | Change-Id: I61de8ce1d9e37e30db62e776979b3f22dc643894
* | | Implement array creation related DEX instructions.Nicolas Geoffray2014-10-226-7/+284
| | | | | | | | | | | | | | | | | | Implement new-array, filled-new-array, and fill-array-data. Change-Id: I405560d66777a57d881e384265322617ac5d3ce3
* | | Merge "Various fixes related to integer negate operations."Roland Levillain2014-10-222-2/+6
|\ \ \ | |/ / |/| |
| * | Various fixes related to integer negate operations.Roland Levillain2014-10-222-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Emit an RSB instruction for HNeg nodes in the ARM code generator instead of RSBS, as we do not need to update the condition code flags in this case. - Simply punt when trying to statically evaluate a long unary operation, instead of aborting. - Move a test case to the right place. Change-Id: I35eb8dea58ed35258d4d8df77181159c3ab07b6f
* | | Fix register_allocator_test after reg alloc changes.Nicolas Geoffray2014-10-211-2/+2
|/ / | | | | | | Change-Id: Ieaf5daf35efaff6685720a93a442cd7a152f1567
* | Fix off by one errors in linear scan register allocator.Nicolas Geoffray2014-10-213-8/+10
| | | | | | | | Change-Id: I65eea3cc125e12106a7160d30cb91c5d173bd405
* | Merge "Implement register allocator for floating point registers."Nicolas Geoffray2014-10-2124-138/+647
|\ \
| * | Implement register allocator for floating point registers.Nicolas Geoffray2014-10-2124-138/+647
| | | | | | | | | | | | | | | | | | | | | | | | Also: - Fix misuses of emitting the rex prefix in the x86_64 assembler. - Fix movaps code generation in the x86_64 assembler. Change-Id: Ib6dcf6e7c4a9c43368cfc46b02ba50f69ae69cbe
* | | Merge "Enable generic JNI for x86 and ARM when interpret-only."Ian Rogers2014-10-211-1/+15
|\ \ \ | |/ / |/| |
| * | Enable generic JNI for x86 and ARM when interpret-only.Ian Rogers2014-10-211-1/+15
| | | | | | | | | | | | Change-Id: I006ce1ce74acd0f0d53d380e28e409d24d772ea3
* | | Merge "Constant folding on unary operations in the optimizing compiler."Roland Levillain2014-10-214-8/+94
|\ \ \
| * | | Constant folding on unary operations in the optimizing compiler.Roland Levillain2014-10-214-8/+94
| | | | | | | | | | | | | | | | Change-Id: I4b77afa2a89f5ad2eedd4d6c0c6c382585419349
* | | | Merge "Implement int negate instruction in the optimizing compiler."Roland Levillain2014-10-216-0/+170
|\ \ \ \ | |/ / /