From 7f515181fdbe88a139d973d3481964d9cb7ed118 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Fri, 24 Nov 2023 12:02:13 +0100 Subject: 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 --- compiler/optimizing/nodes.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'compiler/optimizing/nodes.cc') 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; -- cgit v1.2.3-59-g8ed1b