diff options
author | 2023-11-24 12:02:13 +0100 | |
---|---|---|
committer | 2023-11-27 11:43:58 +0000 | |
commit | 7f515181fdbe88a139d973d3481964d9cb7ed118 (patch) | |
tree | dcd9802bb4eed26591d69972e605d27c68164f98 /compiler/optimizing/nodes.cc | |
parent | db8d042c6dc12d9d1ba5ff2526ccc86a077570ca (diff) |
Simplify boxing followed by unboxing.
Also mark boxing `valueOf()` intrinsics as never null
to avoid creating unnecessary `HNullCheck` instructions.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Change-Id: I86e7721e3af6c59407aa2ddfc1bd11bd2fdac83c
Diffstat (limited to 'compiler/optimizing/nodes.cc')
-rw-r--r-- | compiler/optimizing/nodes.cc | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index 53ed49a307..2cfe5b3ae2 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -35,6 +35,7 @@ #include "class_root-inl.h" #include "code_generator.h" #include "common_dominator.h" +#include "intrinsic_objects.h" #include "intrinsics.h" #include "intrinsics_list.h" #include "mirror/class-inl.h" @@ -3363,6 +3364,21 @@ std::ostream& operator<<(std::ostream& os, HInvokeStaticOrDirect::ClinitCheckReq } } +bool HInvokeStaticOrDirect::CanBeNull() const { + if (GetType() != DataType::Type::kReference || IsStringInit()) { + return false; + } + switch (GetIntrinsic()) { +#define DEFINE_BOXED_CASE(name, unused1, unused2, unused3, unused4) \ + case Intrinsics::k##name##ValueOf: \ + return false; + BOXED_TYPES(DEFINE_BOXED_CASE) +#undef DEFINE_BOXED_CASE + default: + return true; + } +} + bool HInvokeVirtual::CanDoImplicitNullCheckOn(HInstruction* obj) const { if (obj != InputAt(0)) { return false; |