summaryrefslogtreecommitdiff
path: root/compiler/optimizing/nodes.cc
diff options
context:
space:
mode:
author Santiago Aboy Solanes <solanes@google.com> 2024-11-14 15:09:41 +0000
committer Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-11-21 12:39:22 +0000
commita21eb118c8c1e9d362b7465327f1fae8db48a572 (patch)
treee5542170e0de695c9dd491fa7b77a7deb73e28ae /compiler/optimizing/nodes.cc
parent53d8174b0003eb22192aba21d54ca96947002151 (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.cc26
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;
}
}