diff options
Diffstat (limited to 'compiler/optimizing/nodes.cc')
-rw-r--r-- | compiler/optimizing/nodes.cc | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index e7aabb223a..31e999a282 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -3263,17 +3263,35 @@ std::ostream& operator<<(std::ostream& os, HInvokeStaticOrDirect::ClinitCheckReq } bool HInvokeStaticOrDirect::CanBeNull() const { - if (GetType() != DataType::Type::kReference || IsStringInit()) { + if (IsStringInit()) { return false; } + return HInvoke::CanBeNull(); +} + +bool HInvoke::CanBeNull() const { switch (GetIntrinsic()) { + case Intrinsics::kThreadCurrentThread: + case Intrinsics::kStringBufferAppend: + case Intrinsics::kStringBufferToString: + case Intrinsics::kStringBuilderAppendObject: + case Intrinsics::kStringBuilderAppendString: + case Intrinsics::kStringBuilderAppendCharSequence: + case Intrinsics::kStringBuilderAppendCharArray: + case Intrinsics::kStringBuilderAppendBoolean: + case Intrinsics::kStringBuilderAppendChar: + case Intrinsics::kStringBuilderAppendInt: + case Intrinsics::kStringBuilderAppendLong: + case Intrinsics::kStringBuilderAppendFloat: + case Intrinsics::kStringBuilderAppendDouble: + case Intrinsics::kStringBuilderToString: #define DEFINE_BOXED_CASE(name, unused1, unused2, unused3, unused4) \ - case Intrinsics::k##name##ValueOf: \ - return false; + case Intrinsics::k##name##ValueOf: BOXED_TYPES(DEFINE_BOXED_CASE) #undef DEFINE_BOXED_CASE + return false; default: - return true; + return GetType() == DataType::Type::kReference; } } |