diff options
author | 2024-11-14 15:09:41 +0000 | |
---|---|---|
committer | 2024-11-21 12:39:22 +0000 | |
commit | a21eb118c8c1e9d362b7465327f1fae8db48a572 (patch) | |
tree | e5542170e0de695c9dd491fa7b77a7deb73e28ae /compiler/optimizing/nodes.cc | |
parent | 53d8174b0003eb22192aba21d54ca96947002151 (diff) |
Allow the inliner to devirtualize intrinsics
To do so update:
* TryReplaceStringBuilderAppend
* Code paths relevant to previously InvokeVirtual that are now
InvokeStaticOrDirect
* checker tests.
Bug: 369206455
Test: art/test/testrunner/testrunner.py --host --64 -b --optimizing
Change-Id: I4d40980e416f3130d3c344c5f07b7b331deb5c97
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; } } |