From 032cacdbf32c50d3c43590600ed1e171a35fa93c Mon Sep 17 00:00:00 2001 From: Igor Murashkin Date: Thu, 6 Apr 2017 14:40:08 -0700 Subject: optimizing: do not illegally remove constructor barriers after inlining Remove the illegal optimization that destroyed constructor barriers after inlining invoke-super constructor calls. --- According to JLS 7.5.1, "Note that if one constructor invokes another constructor, and the invoked constructor sets a final field, the freeze for the final field takes place at the end of the invoked constructor." This means if an object is published (stored to a location potentially visible to another thread) inside of an outer constructor, all final field stores from any inner constructors must be visible to other threads. Test: art/test.py Bug: 37001605 Change-Id: I3b55f6c628ff1773dab88022a6475d50a1a6f906 --- compiler/optimizing/inliner.cc | 20 -------------------- 1 file changed, 20 deletions(-) (limited to 'compiler/optimizing/inliner.cc') diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index 298ae5c847..66948ebf8c 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -1565,25 +1565,6 @@ bool HInliner::TryBuildAndInlineHelper(HInvoke* invoke_instruction, /* verified_method */ nullptr, dex_cache); - bool requires_ctor_barrier = false; - - if (dex_compilation_unit.IsConstructor()) { - // If it's a super invocation and we already generate a barrier there's no need - // to generate another one. - // We identify super calls by looking at the "this" pointer. If its value is the - // same as the local "this" pointer then we must have a super invocation. - bool is_super_invocation = invoke_instruction->InputAt(0)->IsParameterValue() - && invoke_instruction->InputAt(0)->AsParameterValue()->IsThis(); - if (is_super_invocation && graph_->ShouldGenerateConstructorBarrier()) { - requires_ctor_barrier = false; - } else { - Thread* self = Thread::Current(); - requires_ctor_barrier = compiler_driver_->RequiresConstructorBarrier(self, - dex_compilation_unit.GetDexFile(), - dex_compilation_unit.GetClassDefIndex()); - } - } - InvokeType invoke_type = invoke_instruction->GetInvokeType(); if (invoke_type == kInterface) { // We have statically resolved the dispatch. To please the class linker @@ -1596,7 +1577,6 @@ bool HInliner::TryBuildAndInlineHelper(HInvoke* invoke_instruction, graph_->GetArena(), callee_dex_file, method_index, - requires_ctor_barrier, compiler_driver_->GetInstructionSet(), invoke_type, graph_->IsDebuggable(), -- cgit v1.2.3-59-g8ed1b