From 68c981fad87720fae9c799b240141ce3c12cd5bf Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Fri, 26 Aug 2016 13:13:33 +0100 Subject: ARM/MIPS: Avoid dead dex cache arrays base for intrinsics. Test: Run ART test suite on host and Nexus 6. Change-Id: Ie2ad70f1e3f125eae5dad53a6384d405e0311505 --- compiler/optimizing/intrinsics.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'compiler/optimizing/intrinsics.h') diff --git a/compiler/optimizing/intrinsics.h b/compiler/optimizing/intrinsics.h index 1a8eb58857..62f731d03f 100644 --- a/compiler/optimizing/intrinsics.h +++ b/compiler/optimizing/intrinsics.h @@ -243,6 +243,24 @@ UNREACHABLE_INTRINSIC(Arch, UnsafeLoadFence) \ UNREACHABLE_INTRINSIC(Arch, UnsafeStoreFence) \ UNREACHABLE_INTRINSIC(Arch, UnsafeFullFence) +template +bool IsCallFreeIntrinsic(HInvoke* invoke, Codegenerator* codegen) { + if (invoke->GetIntrinsic() != Intrinsics::kNone) { + // This invoke may have intrinsic code generation defined. However, we must + // now also determine if this code generation is truly there and call-free + // (not unimplemented, no bail on instruction features, or call on slow path). + // This is done by actually calling the locations builder on the instruction + // and clearing out the locations once result is known. We assume this + // call only has creating locations as side effects! + // TODO: Avoid wasting Arena memory. + IntrinsicLocationsBuilder builder(codegen); + bool success = builder.TryDispatch(invoke) && !invoke->GetLocations()->CanCall(); + invoke->SetLocations(nullptr); + return success; + } + return false; +} + } // namespace art #endif // ART_COMPILER_OPTIMIZING_INTRINSICS_H_ -- cgit v1.2.3-59-g8ed1b