summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Andreas Gampe <agampe@google.com> 2017-04-21 19:01:43 +0000
committer android-build-merger <android-build-merger@google.com> 2017-04-21 19:01:43 +0000
commit5337d69ccbf8a5aed1fcbfbf9cdc86f98c1dbe88 (patch)
treeaedc83b3a2cb5b5d0e7afae181784451bce2b727
parent90a9c1d00ad2c8b8591a393b8448cfb800d71a14 (diff)
parente0ffd22714fd4bc4edf81000966b98eae59788dd (diff)
Merge changes from topic 'art_move_inline_method_anlyzer_to_compiler'
am: e0ffd22714 Change-Id: I697f4a9bb76b30c76af15fa1da20dc222c9bf12c
-rw-r--r--compiler/Android.bp1
-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.cc2
-rw-r--r--runtime/Android.bp2
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",