diff options
| author | 2017-04-21 19:01:43 +0000 | |
|---|---|---|
| committer | 2017-04-21 19:01:43 +0000 | |
| commit | 5337d69ccbf8a5aed1fcbfbf9cdc86f98c1dbe88 (patch) | |
| tree | aedc83b3a2cb5b5d0e7afae181784451bce2b727 | |
| parent | 90a9c1d00ad2c8b8591a393b8448cfb800d71a14 (diff) | |
| parent | e0ffd22714fd4bc4edf81000966b98eae59788dd (diff) | |
Merge changes from topic 'art_move_inline_method_anlyzer_to_compiler'
am: e0ffd22714
Change-Id: I697f4a9bb76b30c76af15fa1da20dc222c9bf12c
| -rw-r--r-- | compiler/Android.bp | 1 | ||||
| -rw-r--r-- | compiler/dex/inline_method_analyser.cc (renamed from runtime/quick/inline_method_analyser.cc) | 26 | ||||
| -rw-r--r-- | compiler/dex/inline_method_analyser.h (renamed from runtime/quick/inline_method_analyser.h) | 127 | ||||
| -rw-r--r-- | compiler/optimizing/inliner.cc | 2 | ||||
| -rw-r--r-- | runtime/Android.bp | 2 |
5 files changed, 5 insertions, 153 deletions
diff --git a/compiler/Android.bp b/compiler/Android.bp index 312fc7b35a..dec8b577d8 100644 --- a/compiler/Android.bp +++ b/compiler/Android.bp @@ -29,6 +29,7 @@ art_cc_defaults { "debug/elf_debug_writer.cc", "dex/dex_to_dex_compiler.cc", "dex/dex_to_dex_decompiler.cc", + "dex/inline_method_analyser.cc", "dex/verified_method.cc", "dex/verification_results.cc", "dex/quick_compiler_callbacks.cc", diff --git a/runtime/quick/inline_method_analyser.cc b/compiler/dex/inline_method_analyser.cc index 3347070468..e691a67dc0 100644 --- a/runtime/quick/inline_method_analyser.cc +++ b/compiler/dex/inline_method_analyser.cc @@ -26,7 +26,6 @@ #include "dex_instruction_utils.h" #include "mirror/class-inl.h" #include "mirror/dex_cache-inl.h" -#include "verifier/method_verifier-inl.h" /* * NOTE: This code is part of the quick compiler. It lives in the runtime @@ -391,7 +390,6 @@ bool AnalyseConstructor(const DexFile::CodeItem* code_item, #undef STORE_IPUT result->opcode = kInlineOpConstructor; - result->flags = kInlineSpecial; result->d.constructor_data.reserved = 0u; return true; } @@ -429,25 +427,6 @@ static_assert(InlineMethodAnalyser::IGetVariant(Instruction::IGET_CHAR) == static_assert(InlineMethodAnalyser::IGetVariant(Instruction::IGET_SHORT) == InlineMethodAnalyser::IPutVariant(Instruction::IPUT_SHORT), "iget/iput_short variant"); -// This is used by compiler and debugger. We look into the dex cache for resolved methods and -// fields. However, in the context of the debugger, not all methods and fields are resolved. Since -// we need to be able to detect possibly inlined method, we pass a null inline method to indicate -// we don't want to take unresolved methods and fields into account during analysis. -bool InlineMethodAnalyser::AnalyseMethodCode(verifier::MethodVerifier* verifier, - InlineMethod* result) { - DCHECK(verifier != nullptr); - if (!Runtime::Current()->UseJitCompilation()) { - DCHECK_EQ(verifier->CanLoadClasses(), result != nullptr); - } - - // Note: verifier->GetMethod() may be null. - return AnalyseMethodCode(verifier->CodeItem(), - verifier->GetMethodReference(), - (verifier->GetAccessFlags() & kAccStatic) != 0u, - verifier->GetMethod(), - result); -} - bool InlineMethodAnalyser::AnalyseMethodCode(ArtMethod* method, InlineMethod* result) { const DexFile::CodeItem* code_item = method->GetCodeItem(); if (code_item == nullptr) { @@ -473,7 +452,6 @@ bool InlineMethodAnalyser::AnalyseMethodCode(const DexFile::CodeItem* code_item, case Instruction::RETURN_VOID: if (result != nullptr) { result->opcode = kInlineOpNop; - result->flags = kInlineSpecial; result->d.data = 0u; } return true; @@ -549,7 +527,6 @@ bool InlineMethodAnalyser::AnalyseReturnMethod(const DexFile::CodeItem* code_ite if (result != nullptr) { result->opcode = kInlineOpReturnArg; - result->flags = kInlineSpecial; InlineReturnArgData* data = &result->d.return_data; data->arg = reg - arg_start; data->is_wide = (return_opcode == Instruction::RETURN_WIDE) ? 1u : 0u; @@ -586,7 +563,6 @@ bool InlineMethodAnalyser::AnalyseConstMethod(const DexFile::CodeItem* code_item } if (result != nullptr) { result->opcode = kInlineOpNonWideConst; - result->flags = kInlineSpecial; result->d.data = static_cast<uint64_t>(const_value); } return true; @@ -647,7 +623,6 @@ bool InlineMethodAnalyser::AnalyseIGetMethod(const DexFile::CodeItem* code_item, return false; } result->opcode = kInlineOpIGet; - result->flags = kInlineSpecial; data->op_variant = IGetVariant(opcode); data->method_is_static = is_static ? 1u : 0u; data->object_arg = object_arg; // Allow IGET on any register, not just "this". @@ -716,7 +691,6 @@ bool InlineMethodAnalyser::AnalyseIPutMethod(const DexFile::CodeItem* code_item, return false; } result->opcode = kInlineOpIPut; - result->flags = kInlineSpecial; data->op_variant = IPutVariant(opcode); data->method_is_static = is_static ? 1u : 0u; data->object_arg = object_arg; // Allow IPUT on any register, not just "this". diff --git a/runtime/quick/inline_method_analyser.h b/compiler/dex/inline_method_analyser.h index 2df2ced7f4..a35e97fa11 100644 --- a/runtime/quick/inline_method_analyser.h +++ b/compiler/dex/inline_method_analyser.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_RUNTIME_QUICK_INLINE_METHOD_ANALYSER_H_ -#define ART_RUNTIME_QUICK_INLINE_METHOD_ANALYSER_H_ +#ifndef ART_COMPILER_DEX_INLINE_METHOD_ANALYSER_H_ +#define ART_COMPILER_DEX_INLINE_METHOD_ANALYSER_H_ #include "base/macros.h" #include "base/mutex.h" @@ -36,128 +36,12 @@ class MethodVerifier; class ArtMethod; enum InlineMethodOpcode : uint16_t { - kIntrinsicDoubleCvt, - kIntrinsicFloatCvt, - kIntrinsicFloat2Int, - kIntrinsicDouble2Long, - kIntrinsicFloatIsInfinite, - kIntrinsicDoubleIsInfinite, - kIntrinsicFloatIsNaN, - kIntrinsicDoubleIsNaN, - kIntrinsicReverseBits, - kIntrinsicReverseBytes, - kIntrinsicBitCount, - kIntrinsicCompare, - kIntrinsicHighestOneBit, - kIntrinsicLowestOneBit, - kIntrinsicNumberOfLeadingZeros, - kIntrinsicNumberOfTrailingZeros, - kIntrinsicRotateRight, - kIntrinsicRotateLeft, - kIntrinsicSignum, - kIntrinsicAbsInt, - kIntrinsicAbsLong, - kIntrinsicAbsFloat, - kIntrinsicAbsDouble, - kIntrinsicMinMaxInt, - kIntrinsicMinMaxLong, - kIntrinsicMinMaxFloat, - kIntrinsicMinMaxDouble, - kIntrinsicCos, - kIntrinsicSin, - kIntrinsicAcos, - kIntrinsicAsin, - kIntrinsicAtan, - kIntrinsicAtan2, - kIntrinsicCbrt, - kIntrinsicCosh, - kIntrinsicExp, - kIntrinsicExpm1, - kIntrinsicHypot, - kIntrinsicLog, - kIntrinsicLog10, - kIntrinsicNextAfter, - kIntrinsicSinh, - kIntrinsicTan, - kIntrinsicTanh, - kIntrinsicSqrt, - kIntrinsicCeil, - kIntrinsicFloor, - kIntrinsicRint, - kIntrinsicRoundFloat, - kIntrinsicRoundDouble, - kIntrinsicReferenceGetReferent, - kIntrinsicCharAt, - kIntrinsicCompareTo, - kIntrinsicEquals, - kIntrinsicGetCharsNoCheck, - kIntrinsicIsEmptyOrLength, - kIntrinsicIndexOf, - kIntrinsicNewStringFromBytes, - kIntrinsicNewStringFromChars, - kIntrinsicNewStringFromString, - kIntrinsicCurrentThread, - kIntrinsicPeek, - kIntrinsicPoke, - kIntrinsicCas, - kIntrinsicUnsafeGet, - kIntrinsicUnsafePut, - - // 1.8. - kIntrinsicUnsafeGetAndAddInt, - kIntrinsicUnsafeGetAndAddLong, - kIntrinsicUnsafeGetAndSetInt, - kIntrinsicUnsafeGetAndSetLong, - kIntrinsicUnsafeGetAndSetObject, - kIntrinsicUnsafeLoadFence, - kIntrinsicUnsafeStoreFence, - kIntrinsicUnsafeFullFence, - - kIntrinsicSystemArrayCopyCharArray, - kIntrinsicSystemArrayCopy, - kInlineOpNop, kInlineOpReturnArg, kInlineOpNonWideConst, kInlineOpIGet, kInlineOpIPut, kInlineOpConstructor, - kInlineStringInit, -}; -std::ostream& operator<<(std::ostream& os, const InlineMethodOpcode& rhs); - -enum InlineMethodFlags : uint16_t { - kNoInlineMethodFlags = 0x0000, - kInlineIntrinsic = 0x0001, - kInlineSpecial = 0x0002, -}; - -// IntrinsicFlags are stored in InlineMethod::d::raw_data -enum IntrinsicFlags { - kIntrinsicFlagNone = 0, - - // kIntrinsicMinMaxInt - kIntrinsicFlagMax = kIntrinsicFlagNone, - kIntrinsicFlagMin = 1, - - // kIntrinsicIsEmptyOrLength - kIntrinsicFlagLength = kIntrinsicFlagNone, - kIntrinsicFlagIsEmpty = kIntrinsicFlagMin, - - // kIntrinsicIndexOf - kIntrinsicFlagBase0 = kIntrinsicFlagMin, - - // kIntrinsicUnsafeGet, kIntrinsicUnsafePut, kIntrinsicUnsafeCas - kIntrinsicFlagIsLong = kIntrinsicFlagMin, - // kIntrinsicUnsafeGet, kIntrinsicUnsafePut - kIntrinsicFlagIsVolatile = 2, - // kIntrinsicUnsafePut, kIntrinsicUnsafeCas - kIntrinsicFlagIsObject = 4, - // kIntrinsicUnsafePut - kIntrinsicFlagIsOrdered = 8, - - // kIntrinsicDoubleCvt, kIntrinsicFloatCvt. - kIntrinsicFlagToFloatingPoint = kIntrinsicFlagMin, }; struct InlineIGetIPutData { @@ -198,7 +82,6 @@ static_assert(sizeof(InlineConstructorData) == sizeof(uint64_t), struct InlineMethod { InlineMethodOpcode opcode; - InlineMethodFlags flags; union { uint64_t data; InlineIGetIPutData ifield_data; @@ -213,12 +96,8 @@ class InlineMethodAnalyser { * Analyse method code to determine if the method is a candidate for inlining. * If it is, record the inlining data. * - * @param verifier the method verifier holding data about the method to analyse. - * @param method placeholder for the inline method data. * @return true if the method is a candidate for inlining, false otherwise. */ - static bool AnalyseMethodCode(verifier::MethodVerifier* verifier, InlineMethod* result) - REQUIRES_SHARED(Locks::mutator_lock_); static bool AnalyseMethodCode(ArtMethod* method, InlineMethod* result) REQUIRES_SHARED(Locks::mutator_lock_); @@ -274,4 +153,4 @@ class InlineMethodAnalyser { } // namespace art -#endif // ART_RUNTIME_QUICK_INLINE_METHOD_ANALYSER_H_ +#endif // ART_COMPILER_DEX_INLINE_METHOD_ANALYSER_H_ diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index 4af2539812..1f8a58cdaa 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -22,6 +22,7 @@ #include "class_linker.h" #include "constant_folding.h" #include "dead_code_elimination.h" +#include "dex/inline_method_analyser.h" #include "dex/verified_method.h" #include "dex/verification_results.h" #include "driver/compiler_driver-inl.h" @@ -37,7 +38,6 @@ #include "optimizing_compiler.h" #include "reference_type_propagation.h" #include "register_allocator_linear_scan.h" -#include "quick/inline_method_analyser.h" #include "sharpening.h" #include "ssa_builder.h" #include "ssa_phi_elimination.h" diff --git a/runtime/Android.bp b/runtime/Android.bp index 8972e91321..2866d4b4a0 100644 --- a/runtime/Android.bp +++ b/runtime/Android.bp @@ -186,7 +186,6 @@ cc_defaults { "plugin.cc", "primitive.cc", "quick_exception_handler.cc", - "quick/inline_method_analyser.cc", "reference_table.cc", "reflection.cc", "runtime.cc", @@ -451,7 +450,6 @@ gensrcs { "oat.h", "object_callbacks.h", "process_state.h", - "quick/inline_method_analyser.h", "runtime.h", "stack.h", "thread.h", |